Число из элементов массива

327
24 ноября 2017, 04:05

Добрый вечер! Как можно решить данную задачу: требуется написать консольное приложение на языке с#, пользователь вводит размер массива, далее массив заполняется случайными числами от 0 до 100 (именно до 100, не до 101), заполненный массив выводится на экран, после этого пользователя просят ввести еще одно рандомное целочисленное число, после этого программа должна попытаться составить введенное число из элементов массива складывая их друг с другом или самих на себя (только сложение), например, массив получился таким: 1 2 3 4 5 6 7, пользователь ввел число 125 - ответ: такое число получить не удалось, а если введено было число: 12 - ответом должно быть: такое число возможно получить и в идеале перечислить из каких элементов массива оно получается? Очень долго думал на как это реализовать... Буду очень признателен! PS: если это облегчит задачу, то можно обойтись фиксированным размер массива - 20.

Answer 1

Алгоритм решения должен опираться на перебор всех елементов которые меньше или равны искомому. Здесь можно попробовать решить при помощи рекурсии. Следующий код не проверял на работоспособность, здесь чисто декларативное описание:

List<int> GetSumm(int[] array, int sum)
{
     Array.Sort(array);
     var stack = new Stack<int>();
     if (FindSumR(array, stack, sum));
         return stack.ToList();
     // не фартануло
     return null;
}
bool FindSumRec(int[] array, Stack<int> stack, int sum)
{
     var indx = Array.FindIndex(array, item => item > sum) - 1; // индекс элемента который меньше или равен искомому
     if (indx < 0) return false;
     var diff = sum - array[indx];
     // если уже меньше то двигаться вперёд смысла нет.
     if (diff < 0) return false;
     // если равен нулю то мы нашли комбинацию.
     if (diff == 0) 
     {
           stack.Push(array[indx]);
           return true;
     }
     // перебираем все оставшиеся варианты
     stack.Pop(array[indx]);
     while (!FindSumRec(array, stack, sum - array[indx])) 
     {
          indx--;
          // так и не нашли подходящей комбинации
          if (indx < 0) return false;              
          // перебираем дальше
          stack.Pop()
          stack.Push(array[indx]);
     }
     return true;
}
Answer 2

Написал небольшой велосипед, думаю сможет вам помочь:

        public void Checker(int[] numb, int x)
    {
        int b, c, d;
        b = x % 1000 / 100;
        c = x % 100 / 10;
        d = x % 10;
        for (int i = 0; i < numb.Length;i++)
        {
            if (numb[i] == b && +numb[i + 1] == c && numb[i + 2] == d)
            {
                Console.WriteLine("Corrent");
            }
        }
    }

Первым входящим аргументом будет массив чисел, вторым - число введеное пользователем. Ньюанс - Число аргументов в проверке должно быть точно заданным пользователем. В данном случае - это трехзначное число. В случае введенного 2 или 1 значного числа вы не получите должный результат, нужно добавить функционал проверки на null каждого аргумента разрядности числа.

READ ALSO
Левой меню в Prestashop

Левой меню в Prestashop

Доброе время суток, возник такой вопрос Есть стандартный модуль в Престашоп 17 для вывода меню всех категории на странице категории ps_categorytree,...

344
Метод split() + RegExp

Метод split() + RegExp

Всем привет! Задача разбить строку '15675m^2' на массив через регулярку

448
Как запустить сторонний код на Wordpress

Как запустить сторонний код на Wordpress

Есть код калькулятора который надо вставить на определенную страницу WordPressПри установке - он не работает

402
window.onload = function работает только в отладчике

window.onload = function работает только в отладчике

Подскажите COMPADRES, где-то налажал

326