У меня недавно был тест в моем классе. Одна из проблем заключалась в следующем:
Given a number n, write a function in C/C++ that returns the sum of the digits of the number squared. (The following is important). The range of n is [ -(10^7), 10^7 ]. Example: If n= 123, your function should return 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 или более новой. Таким образом, я предполагаю (читая комментарии), что моя версия получит правильный ответ в любом случае.