Приветствую всех сегодня решаем задачу по программированию. Условие задачи: Вывести в массив все натуральные четырехзначные числа, в десятичной записи которых нет одинаковых цифр, и разность двух натуральных двухзначных чисел, составленных из двух последовательных первых цифр и двух последовательных последних цифр числа, равна сумме всех цифр числа.
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);
}
}
}
}
}
Остается только добавить в массив.
Альтернативный код решения с помощью лямбд с комментариями
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();
*}
*/
}
}
