Rightmost Digit
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 24000 Accepted Submission(s): 9155
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).
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 6HintIn 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.
Author
Ignatius.L
解题思路:
方案1、每次取末位相乘。(该方法代码就不贴了,学过c的基本都会写吧,小心超时哦!当然>10应该先只取末位,而且要知道他是有规律的(跟4有关不多说了),代码简单)
方案2、找规律。
方案3、取对数,思路类似1060。
{有一个常规的方法是利用对数
可以令n^n=A*10^L A的范围是(0,1),L是n^n计算出来后的位数
L的计算方法是对n^n取10的对数在取整,即L=[nlgn]
那么n^n=A*10^([nlgn])
这样之后,两边同时对10取对数
得到:nlgn=lgA+[nlgn]
于是乎lgA=nlgn-[nlgn]
A=10^(nlgn-[nlgn])
由于A是(0,1),此时只需计算[A*10]即可。
摘自http://blog.csdn.net/creazierhit/article/details/7787249
}这貌似连样例都过不了,大家也可以试试。有用方案3,AC的可以@我。
代码2:(亮爆你的双眼)
#include<stdio.h>
#include<string.h>
main()
{
int n,i,t,s,l,m;
char a[12];
scanf("%d",&n);
getchar();
for(i=0;i<n;i++)
{
gets(a);
l=strlen(a);
t=a[l-1]-48;
switch(t){
case 1: s=1;break;
case 5: s=5;break;
case 6: s=6;break;
case 0: s=0;break;
case 2: if(l>1) m=t+(a[l-2]-48)*10;
else m=t;
m%=4;
switch (m){
case 0:s=6;break;
case 1:s=2;break;
case 2:s=4;break;
case 3:s=8;break;
}break;
case 3:if(l>1) m=t+(a[l-2]-48)*10;
else m=t;
m%=4;
switch (m){
case 0:s=1;break;
case 1:s=3;break;
case 2:s=9;break;
case 3:s=7;break;
}break;
case 4:m=t;
m%=2;
switch (m){
case 0:s=6;break;
case 1:s=4;break;
}break;
case 7:
if(l>1) m=t+(a[l-2]-48)*10;
else m=t;
m%=4;
switch (m){
case 0:s=1;break;
case 1:s=7;break;
case 2:s=9;break;
case 3:s=3;break;
}break;
case 8: if(l>1) m=t+(a[l-2]-48)*10;
else m=t;
m%=4;
switch (m){
case 0:s=6;break;
case 1:s=8;break;
case 2:s=4;break;
case 3:s=2;break;
}break;
case 9:m=t;
m%=2;
switch (m){
case 0:s=1;break;
case 1:s=9;break;
}break;
}
printf("%d\n",s);
}
}