2012-08-31 31 views

回答

4

雖然@SamGrondahl是在正確的軌道上,不幸的是,如果你輸入一個負數它提供了意想不到的效果。這應該適用於負數:

int sumdigits(int number) { 
    int sign = number < 0 ? -1 : 1; 
    number = sign * number; // abs the number 

    if (number < 10) 
     return sign * number; 
    else 
     return sign * (number % 10 + sumdigits(number/10)); 
} 

這將返回數字的總和,如果數字爲負數,則取反。

-1

這應該做你想要什麼:

int recurse(int number) { 
    if (abs(number) < 10) return number; 
    return number % 10 + recurse (number/10); 
} 
+0

如果這個數字是負數?然後給出意想不到的結果。 –

+0

你爲什麼總結一個負數的數字? –

+4

爲什麼*不會*你? – Makoto

1

由於INT_MIN的否定可能不適合於int,所以一個正確的答案比第一眼看起來更復雜。發佈的解決方案在大多數情況下可以通過在遞歸過程中更改它們的實現來使用unsigned int。以下是另一種選擇。

int sum_digits_recursively (char digits[], int i) { 
    if (i == 0 && digits[i] == '-') return -sum_digits_recursively(digits, 1); 
    if (digits[i] == '\0') return 0; 
    return (digits[i]-'0') + sum_digits_recursively(digits, i+1); 
} 

int sum_digits (int x) { 
    char digits[sizeof(x) * CHAR_BIT]; 
    snprintf(digits, sizeof(digits), "%d", x); 
    return sum_digits_recursively(digits, 0); 
}