这题要求的是n^n的digital Roots,其中n<10000。显然的是肯定是不能暴力解决了!
找规律。
该题的规律是这样的:无需直接求出n^n来再求其digital Roots。而是“平方一求”,然后用个循环一直计算完所有幂次为止。可见,这样处理之后最多计算5000即可。
举个例子来说明下:9^9。先求9*9=81的digital Roots为9;然后用9*(9*9),再求其digital Roots为9;继续9*(9*9)......直到计算完所有幂次为止。
AC代码:51MS
#include<iostream>
using namespace std;
int digitRoot(int a) //取任一个数的root
{
int tmp;
while(a>9)
{
tmp=a;
a=0;
while(tmp!=0)
{
a+=tmp%10;
tmp/=10;
}
}
return a;
}
void deal(int n)
{
int rem=n;
bool flag=false;
if(n%2!=0)
{
rem--;
flag=true;
}
int i,dr=1;
for(i=1;i<=rem;i+=2)
{
dr=digitRoot(dr*n*n);
}
if(flag)
dr=digitRoot(dr*n);
cout<<dr<<endl;
}
int main()
{
int n;
while(cin>>n,n)
{
deal(n);
}
return 0;
}