Kod, komentarze objaśniają:
#include <stdio.h>
/* Potęgowanie w integerach: https://en.wikipedia.org/wiki/Exponentiation_by_squaring*/
unsigned long pow(unsigned long a, unsigned long b) {
if (b == 0) return 1;
if (b == 1) return a;
if (b % 2 == 0) return pow(a * a, b / 2);
else return a * pow(a * a, (b - 1) / 2);
}
/* Suma cyfr w liczbie, prosta obserwacja: kolejne cyfry liczby n to (od prawej):
* n % 10
* n / 10 % 10
* n / 100 % 10
* .....
*/
unsigned long sum_digits(unsigned long n){
unsigned long s = 0;
for (unsigned long i = 0; n / pow(10, i) > 0; ++i)
s += (n / pow(10, i)) % 10;
return s;
}
/* Proste, rekurencyjne wywoływanie sumy cyfr, aż do
* przypadku bazowego: liczba jednocyfrowej,
* wtedy n / 10 == 0
* */
unsigned long sum_digits_until_one(unsigned long n) {
if (n / 10 == 0) return n;
else
return sum_digits_until_one(sum_digits(n));
}
int main(int argc, char **argv)
{
printf("%d \n", sum_digits_until_one(98792) == 8); // -> 1 (true)
printf("%d \n", sum_digits_until_one(6841) == 1); // -> 1 (true)
printf("%d \n", sum_digits_until_one(7777) == 1); // -> 1 (true)
printf("%d \n", sum_digits_until_one(12345678) == 9); // -> 1 (true)
printf("%d \n", sum_digits_until_one(90009093) == 3); // -> 1 (true)
printf("%d \n", sum_digits_until_one(21111111111) == 3); // -> 1 (true)
return 0;
}
EDIT: Dodane więcej testów i zmieniony format drukowania integera (w testach).
EDIT1 zmiana w funkcji sum_digits_until_one
z if (n / 10 == 0) return;
, na if (n / 10 == 0) return n;
. Podziekowania za walkę ze złymi duchami idą do @spartanPAGE :)