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

Какой алгоритм в 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 ]

3 голосов
/ 22 февраля 2010

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

При запросе алгоритм (как если бы он был только один) аналогично ошибочен.

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

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

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

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

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

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

2 голосов
/ 22 февраля 2010

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

(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;
    }
0 голосов
/ 22 февраля 2010

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

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

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

0 голосов
/ 22 февраля 2010

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

   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();
...