Problem Description Given a positive integer N, you should output the most right digit of N^N. Input The input contains several test cases. The first line of the input is a single integer T which is the number of test cases. T test cases follow. Each test case contains a single positive integer N(1<=N<=1,000,000,000). Output For each test case, you should output the rightmost digit of N^N. Sample Input 2 3 4 Sample Output 7 6 Hint In the first case, 3 * 3 * 3 = 27, so the rightmost digit is 7. In the second case, 4 * 4 * 4 * 4 = 256, so the rightmost digit is 6.
我写的错误???错误的原因是超时,
//rightmost digit #include<iostream> using namespace std; int main() { int n,tmp,m; cin>>n; while(n--){ cin>>m; tmp=1; m%=10; // cout<<"m-==="<<m<<endl; for(int i=0;i<m;i++) tmp=tmp*m%10; cout<<tmp<<endl; } }
正确代码:
#include<iostream> using namespace std; int main() { int a,ans,n=0; double dval = 0; int count=0; cin>>n; while(n--) { cin>>a; ans=1; count=a; a = a%10; while (count) { if (count&1==1) ans=(ans*a)%10; a=(a*a)%10; count>>=1; } cout<<ans<<endl; } return 0; }
解法二:
读完题首先想到的是大数,但是这大数貌似也太大了,就算能放下,这么多大数乘法铁定超时,考虑优化,写个小程序打表观察能发现这样一个规律,n的次方是有周期性的,且周期为4,这样就好办了,对于给定的N,求N*N的个位数,只需算N的个位数的N%4次方,然后对10取余就是所要求的结果了
#include<iostream> #include<math.h> using namespace std; int main() { int t; cin >> t; while (t--) { int n, m; cin >> n; m = n % 4; if (m == 0) m = 4; n = n % 10; cout <<int( pow(n, m)) % 10 << endl; } return 0; }
PS:
//利用二进制输出 输入的数字 #include<iostream> using namespace std; int main() { int test,t,n,ans; while(cin>>n){ test=n; t=1; ans=0; while(test){ if(test&1==1) ans+=t; t*=2; test>>=1; } cout<<ans<<endl; } }