Приветствую всех сегодня решаем задачу по программированию. Условие задачи: Вывести в массив все натуральные четырехзначные числа, в десятичной записи которых нет одинаковых цифр, и разность двух натуральных двухзначных чисел, составленных из двух последовательных первых цифр и двух последовательных последних цифр числа, равна сумме всех цифр числа.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
using System; using System.Collections.Generic; using System.Data; using System.Data.SqlClient; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace Test { class Program { static int SumDigits(int v, out bool HasRepeatableDigits) { int Sum = 0; HasRepeatableDigits = false; byte[] c = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; while (v > 0) { int m = v % 10; Sum += m; v = v / 10; if (++c[m] > 1) HasRepeatableDigits = true; } return Sum; } static void Main(string[] args) { int s, p1, p2; bool b; for (int i = 1000; i <= 9999; ++i) { s = SumDigits(i, out b); if (!b) { p1 = i / 100; p2 = i % 100; if (p1 - p2 == s) Console.WriteLine(i); } } } } } |
Остается только добавить в массив.
Альтернативный код решения с помощью лямбд с комментариями
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 |
using System; using System.Collections.Generic; using System.Data; using System.Data.SqlClient; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace Test { class Program { private static bool HasDiffNumbers(int a) => a.ToString().ToCharArray().Distinct().Count() == 4; private static bool HasProperSum(int a) => a / 100 - a % 100 == a.ToString().ToCharArray().Select(x => int.Parse(x.ToString())).Sum(); static void Main(string[] args) { var res = Enumerable.Range(1000, 9000).Where(x => HasProperSum(x) && HasDiffNumbers(x)); Console.WriteLine("Result: " + string.Join(", ", res)); Console.WriteLine("Evaluating Done!"); Console.ReadKey(); } //===== ПОЯСНЕНИЯ И КОММЕНТАРИИ===== // Флаг - имеет ли целое число различные цифры /* * Логика работы: * 1) преобразуем число в его строковое представление * 2) Строковое представление в массив символов * 3) Находим различные элементы массива * 4) Считаем количество различных элементов * 5) Если количество различных элементов == 4, то нам подходит данное число */ //private static bool HasDiffNumbers(int a) => a.ToString().ToCharArray().Distinct().Count() == 4; // Флаг - удовлетворяет ли условию, что сумма всех цифр равна разности левой и правой части числа // (разности сотен в числе и остатка от деления на 100 - десятки и единицы в числе) /* * Логика подсчёта: * 1) Число преобразуем в строковое представление * 2) Строковое представление преобразуем в массив символов * 3) массив символов преобразуем каждое в его целочисленный вид: * 3.1) символ преобразуем к строке * 3.2) парсим строку в целочисленное представление (int.Parse не умеет парсить char, нет такой перегрузки) * 4) Суммируем полученные целые * 5) Итог суммы - сравниваем с разностью */ /* private static bool HasProperSum(int a) => a / 100 - a % 100 == a.ToString().ToCharArray().Select(x => int.Parse(x.ToString())).Sum(); static void Main(string[] args) { /*res - результирующий массив * Логика работы: * 1) Берём последовательность от 1000 (включительно) длинной 9000 - это и есть отрезок [1000;9999] * проверить можно взяв Enumerable.Range(1000, 9000).Max() - это 9999 и * Enumerable.Range(1000, 9000).Min() - это 1000 * 2) Фильтруем последовательность по признакам того, что сумма цифр удовлетворяет условию и * у числа различные цифры * Используется "ленивый" оператор И - && * HasProperSum - даёт меньшее множество чисел, поэтому вычисление второго условия HasDiffNumbers происходит * реже, если число не имеет нужное условие по сумме цифр, то нам и без разницы - разные у него цифры или нет * * var res = Enumerable.Range(1000, 9000).Where(x => HasProperSum(x) && HasDiffNumbers(x)); * Console.WriteLine("Result: " + string.Join(", ", res)); * Console.WriteLine("Evaluating Done!"); * Console.ReadKey(); *} */ } } |