Решаем задачу на C#.

Приветствую всех сегодня решаем задачу по программированию. Условие задачи: Вывести в массив все натуральные четырехзначные числа, в десятичной записи которых нет одинаковых цифр, и разность двух натуральных двухзначных чисел, составленных из двух последовательных первых цифр и двух последовательных последних цифр числа, равна сумме всех цифр числа.

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();
            *}
          */
    }
}

 

Обновлено: 14.11.2019 — 12:19

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.