杭电HDOJ 1061 解题报告

来源:互联网 发布:阿里云域名空间 编辑:程序博客网 时间:2024/05/17 04:58

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).
 

Output
For each test case, you should output the rightmost digit of N^N.
 

Sample Input
234
 

Sample Output
76
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.
 

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);}}




原创粉丝点击