问题链接:HDU1013 Digital Roots。入门练习题,用C语言编写程序。
这个问题是对于输入的n,计算n^n的数根。
先看一下以下式子:
因为:(10*a+b)*(10*a+b)=100*a*a+10*2*a*b+b*b
所以右边式子的数根(中间结果,也是左边式子的数根)为:a*a+2*a*b+b*b=(a+b)*(a+b)
故:对于两位数n,n*n的数根=n的树根×n的树根。
同理可以推出,对于任意位数的n,也满足:n*n的数根=n的树根×n的树根。
程序中,实现一个计算整数数根的函数,利用这个函数来计算n^n的数根。
这个问题还有一种解决办法是利用9余数定理来实现。
AC的C语言程序如下:
/* HDU1163 Eddy's digital Roots */ #include <stdio.h> // 计算数根函数 int digitalroots(int val) { int result, temp; while(val) { result = 0; temp = val; while(temp) { result += temp % 10; temp /= 10; } if(result < 10) break; val = result; } return result; } int main(void) { int n, ans, nr, i; while(scanf("%d", &n) != EOF) { if(n == 0) break; // 计算n的数根 ans = nr = digitalroots(n); // 计算n^n的数根 for(i=2; i<=n; i++) { ans = digitalroots(ans * nr); } // 输出结果 printf("%d ", ans); } return 0; }