hdu Rightmost Digit

Rightmost Digit

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 29473    Accepted Submission(s): 11243


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.
题目大意:求n的n次幂的个位数
解法一:暴力解决,即直接n个n相乘然后取它的个位。
代码:
#include <iostream> using namespace std; int main() {  int n,m,k;  cin>>k;     for(int j=0;j<k;j++)   {    cin>>n;   m=1;   for(int i=0;i<n;i++)    m*=n;   cout<<m%10<<endl;   }    return 0; }
提交后为错误为超时,因为n的范围(1<=n<=1000000000).这样做太暴力了。
解法二:进一步节省时间我们尝试用个位数相乘。即计算n%10的n次方。
代码:
#include <iostream> using namespace std; int main() {  int n,m,k,l;  cin>>k;   for(int j=0;j<k;j++)   {    cin>>n;   m=1;   l=n;   n%=10;   for(int i=0;i<l;i++)    m*=n;   cout<<m%10<<endl;   }  return 0; }
结果还是超时,这样依然循环次数太多。我们就应该寻求是否有规律可寻;
解法三:找规律,n个n每次相乘得到的个位数满足4个一循环的规律,例如7的7次幂:9,3,1,7,9,3.
把n个n相乘得到的前四个个位数算则n的N次幂的个位为第(n-1)%4所对应的个位数。
代码:
#include <iostream> using namespace std; int main() {  int n,m,k,l,sum;  cin>>k;   for(int j=0;j<k;j++)   {    cin>>n;   sum=1;   l=n;   n%=10;//求n的个位数   m=(l-1)%4;//n个n的个位数相乘每次相乘都得一个数,只看个位n个n相乘得到n-1个个位,m代表n-1磨四的余。   for(int i=0;i<=m;i++)//求第m个个位数           sum*=n;   cout<<sum%10<<endl;   }  return 0; }
这样优化以后时间大大节省。
对于这种题暴力解决在ac上肯定行不通,故这样的题一般都有规律可循。

你可能感兴趣的:(hdu Rightmost Digit)