Добавьте цифру к целому числу и убедитесь, что сумма каждой цифры заканчивается на 1

Какой алгоритм в C# для этого?

Пример 1: Учитывая n = 972, функция затем добавит 3, чтобы сделать 9723, потому что 9 + 7 + 2 + 3 = 21 (заканчивается 1). Функция должна вернуть 3.

Пример 2: При n = 33 функция добавит 5, чтобы сделать 335, потому что 3 + 3 + 5 = 11 (заканчивается 1). Функция должна вернуть 5.

4 ответа

Алгоритмы не зависят от языка. Запрашивать "алгоритм в C#" не имеет особого смысла.

Запрашиваемая для алгоритма (как будто есть только один) аналогично вводит в заблуждение.

Итак, давайте сделаем это шаг за шагом.

Во-первых, отметим, что только последняя цифра результата имеет смысл. Итак, мы подведем итоги наших существующих цифр, а затем проигнорируем все, кроме последней. Хороший способ сделать это - взять сумму по модулю 10.

Итак, у нас есть сумма существующих цифр, и мы хотим добавить к ней еще одну цифру, чтобы сумма двух заканчивалась на 1.

В подавляющем большинстве случаев это будет означать sum + newDigit = 11, Перестановка дает newDigit = 11 - sum

Затем мы можем взять это по модулю 10 (снова), чтобы уменьшить его до одной цифры.

Наконец, мы умножаем исходное число на 10 и добавляем к нему нашу новую цифру.

Алгоритм в целом:

(10 - (сумма цифр мод 10) + 1) мод 10

Ответом вышеприведенного выражения является ваша нужная цифра.

Сумма цифр Мод 10 дает вам текущий остаток, когда вы вычитаете его из 10, вы получаете необходимое значение для остатка 0. Когда вы добавляете 1, вы получаете необходимое значение, чтобы получить остаток от 1. Последний мод 10 дает вам ответ в виде 1 цифры.

Так в C# как то так:

    static int getNewValue(string s)
    {
        int sum = 0;
        foreach (char c in s)
        {
            sum += Convert.ToInt32(c.ToString());
        }
        int newDigit = (10 - (sum % 10) + 1) % 10;
        return newDigit;
    }

Еще одна альтернатива, использующая мод только один раз

   int sum = 0;
    foreach (char c in s)
        sum += Convert.ToInt32(c.ToString());
    int diff = 0;
    while (sum % 10 != 1)
    {
        sum++; 
        diff++; 
    }
    if (diff > 0)
       s += diff.ToString();

Ну, это проще в C++.

std::string s = boost::lexical_cast<string>( i );
i = i * 10 + 9 - std::accumulate( s.begin(), s.end(), 8 - '0' * s.size() ) % 10;

Зависимый от кода гольф...

Другие вопросы по тегам