Нужно ли явно обрабатывать отрицательные числа или ноль при суммировании квадратов?

1115 Недавно у меня был тест в моем классе. Одной из проблем было следующее:

Учитывая число n , напишите функцию на C / C ++, которая возвращает сумму цифр числа в квадрате . (Важно следующее) Диапазон из n равен [- (10 ^ 7), 10 ^ 7]. Пример: если n = 123, ваша функция должна вернуть 14 (1 ^ 2 + 2 ^ 2 + 3 ^ 2 = 14).

Это функция, которую я написал:

int sum_of_digits_squared(int n) 
{
    int s = 0, c;

    while (n) {
        c = n % 10;
        s += (c * c);
        n /= 10;
    }

    return s;
}

Посмотрел прямо на меня. Итак, теперь тест вернулся, и я обнаружил, что учитель не дал мне все пункты по причине, которую я не понимаю. По его словам, чтобы моя функция была завершена, я должен был добавить следующую деталь:

int sum_of_digits_squared(int n) 
 {
    int s = 0, c;

    if (n == 0) {      //
        return 0;      //
    }                  //
                       // THIS APPARENTLY SHOULD'VE 
    if (n < 0) {       // BEEN IN THE FUNCTION FOR IT
        n = n * (-1);  // TO BE CORRECT
    }                  //

    while (n) {
        c = n % 10;
        s += (c * c);
        n /= 10;
    }

    return s;
}

Аргументом для этого является то, что число n находится в диапазоне [ - (10 ^ 7), 10 ^ 7], так что это может быть отрицательное число. Но я не вижу, где моя собственная версия функции терпит неудачу. Если я правильно понимаю, значение while(n) - это while(n != 0), , а не while (n > 0), поэтому в моей версии функции число n не может не войти в петля. Это будет работать точно так же.

Затем я попробовал обе версии функции на своем компьютере дома, и я получил точно такие же ответы для всех примеров, которые я пробовал. Итак, sum_of_digits_squared(-123) равно sum_of_digits_squared(123) (что опять-таки равно 14) (даже без подробностей, которые я, очевидно, должен был добавить). Действительно, если я попытаюсь напечатать на экране цифры числа (от наименьшего до наибольшего значения), в случае 123 я получу 3 2 1, а в случае -123 я получу -3 -2 -1 (что на самом деле вроде интересно). Но в этой проблеме это не имеет значения, так как мы возводим цифры в квадрат.

Итак, кто не прав?

РЕДАКТИРОВАТЬ : Мое плохое, я забыл указать и не знал, что это важно. Версия C, используемая в нашем классе и тестах, должна быть C99 или новее . Таким образом, я предполагаю (прочитав комментарии), что моя версия получит правильный ответ любым способом.

213
задан Lundin 23 October 2019 в 05:44
поделиться

0 ответов