刚读这个题,感觉很厉害的样子
推理下发现并没有那么难
设n=abcd;则n*n即为(abcd)*(abcd)
设dg(x)为x的digital Roots,则可以证明dg(abcd*abcd) = dg(a+b+c+d) * dg(a+b+c+d)
证明过程如下:
这样直接模拟即可
代码如下:
#include <stdio.h>
#include <string.h>
int g(int n) {
char s[20];
int ans, len, i;
sprintf(s, "%d", n);
len = strlen(s);
ans = 0;
for(i=0; i<len; ++i)
ans += s[i]-'0';
return ans;
}
int f(int n) {
int x = 1;
int times = n;
while(times--) {
x *= n;
while(x > 10)
x = g(x);
}
if(x == 10)//之前缺少这一步,一直WA
x = 1;
return x;
}
int main(void) {
int n;
while(scanf("%d", &n)!=EOF && n)
printf("%d\n", f(n));
return 0;
}
尝试着把f()中的连乘写为二分形式,但是不行,因为n为奇数时太难处理了
在网上看到别人0ms的代码,表示不得不佩服...贴在这里分享下:
想了下为什么直接余9是对的,我觉得可以这样证明:
ABCD%9 = (A*1000%9+B*100%9+C*10%9+D%9) = (A+B+C+D)同上面形式,所以正确
#include<stdio.h>
int main()
{
int a,i,n;
while(scanf("%d",&n)!=EOF&&n!=0)
{
a=n;
for(i=2;i<=n;i++)
a=a*n%9;
if(a==0)
printf("9\n");
else
printf("%d\n",a);
}
return 0;
}