//http://acm.hdu.edu.cn/showproblem.php?pid=1061
题目的意思很简单,就是要求出n的n次幂的各位数字。但是n的范围非常大。1<=N<=1,000,000,000
代码:
#include<iostream>
using namespace std;
int data[10][4] = {{0,0,0,0},{1,1,1,1},{6,6,4,4},{3,3,7,7},
{6,4,6,4},{5,5,5,5},{6,6,6,6},{7,7,3,3},{6,6,4,4},{1,9,1,9}};
int main()
{
int text;
cin >> text;
while(text --)
{
long long n;
int a,b;
cin >> n;
a = n % 10;
b = n % 4;
cout << data[a][b] << endl;
}
return 0;
}
//数据量那么大,想到的方法一定是总结规律了,既然只要各位数字,我就发现只要个位数字是0, 1, 5, 6;的,不论多少次幂,各位是数字永远都是本身,之后我们看2:(各位数字变化的规律是4 8 6 2循环)之后我一次找到了这样的一个数组:
Data[10][4] = {{0,0,0,0},{1,1,1,1},{4,8,6,2},{3,9,7,1},{6,4,6,4},
{5,5,5,5},{6,6,6,6},{9,3,1,7},{4,2,6,8},{1,9,1,9}}
如果你还不理解,那么我把这个数组这样表示:
行下标 (i次幂后的各位数字变化情况)
0 0 0 0 0
1 1 1 1 1
2 4 6 8 2
3 3 9 7 1
4 6 4 6 4
5 5 5 5 5
6 6 6 6 6
7 9 3 1 7
8 4 2 6 8
9 1 9 1 9
这回就清晰了吧!不过这个不是最后想要的结果。我是从这里面想到了要把n对4取余。
之后就重新找规律,这回看的就让n =2 12 22 32 42……,算出n的n
次幂的各位数字是什么,然后再把这个数字放到data[n%10][n%4]的位置。这样就构造出来代码中的那个数组了(需要说明的是数组黄色字体部分,这里面的数字应该是多少都可以的,可以这样理解,如n的各位数字都是2的时候,那么n % 4的结果只能是0或者2。也就是说1和 3的位置的数字是用不上的,但是这里又不能直接把这两列省略,因为当n的各数字是三的时候,n %4的结果就只能是 1和 3)
说了这么多,我觉得问题应该是都清晰了,对于我上面的代码你也应该能理解了。(*^__^*)嘻嘻……