Давайте решим простую, но часто встречаемую задачу - "Дано четырехзначное число. Проверить, является ли оно «счастливым билетом»." Счастливым билетом мы называем такой билет, в котором сумма цифр справа равна сумме цифр слева (например, 1423 - счастливый билет, потому что 1 + 4 = 5 и 2 + 3 = 5). Для начала нам надо научиться находить цифру в числе. Для того, чтоб получить последнюю цифру, нам надо взять остаток от деления на 10. Соответственно, чтоб найти предпоследнюю цифру, необходимо число поделить на 10 и снова взять остаток от деления на 10. Все, что я написал выше в коде выглядит вот так
int number = random.Next(1000, 9999); // generate four digits number int fourthDigit = number % 10; // get 4th digit int thirdDigit = number / 10 % 10; // get 3rd digit int secondDigit = number / 100 % 10; // get 2nd digit int firstDigit = number / 1000 % 10; // get 1st digit
Осталось провести сравнение и вывести результаты пользователю в консоль. Для этого напишем отдельный метод, который будем повторно использовать.
public static void PrintHappyTicket(int number, int sumLeft, int sumRight) { Console.ForegroundColor = ConsoleColor.White; Console.WriteLine("Your ticket number is: " + number); if (sumLeft == sumRight) { Console.ForegroundColor = ConsoleColor.Green; Console.WriteLine("You have a happy ticket ({0} equals {1})", sumLeft, sumRight); } else { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("Sorry, you have a usual ticket ({0} not equals {1})", sumLeft, sumRight); } Console.WriteLine(); }
Теперь пришло время усложнить задачу. Давайте предположим, что мы не знаем кол-во цифр в нашем билете, и оно может варьироваться от 2 до 9. В таком случае нам пора использовать циклы и наш алгоритм будет выглядеть следующим образом
// solution with loops int number2 = random.Next(10, 9999999); ; // generate random digits number int digits = (int)Math.Floor(Math.Log10(number2) + 1); // for students //int digits = number2.ToString().Length; // for hard-core guys int sumRight = 0, sumLeft = 0; // loop via digits of generated number for (int i = 0; i < digits; i++) { int digit = (int)(number2 / (Math.Pow(10, i))) % 10; if (i > digits / 2) { sumLeft += digit; } else { sumRight += digit; } } PrintHappyTicket(number2, sumLeft, sumRight); // print results
Полный исходник вы можете скачать в закрепленном архиве. Архив содержит проект в Visaul Studio 2015 на C#.
dmytro