HDU 1061 RIGHTMOST DIGIT
饿。。。自己用的是一个求周期从而增加时间效率的算法。。。如下:
#include<stdio.h> #include<math.h> #include<string.h> int main() { char a[10]; int t,n,i,len,p,N,j,T,pp; scanf("%d",&n); for(i=0;i<n;i++) { T=0; scanf("%s",a); sscanf(a,"%d",&N); len=strlen(a); if(a[0]=='0') { printf("0\n"); continue; } else { p=a[len-1] - '0'; pp=p; while(1) { p=p*pp; if(p>10)p%=10; T++; if(p==pp) break; } if(N>T && N%T !=0 ) t=N%T; else if(N>T && N%T ==0) t=T; else t = N ; p=pp; for (j=0;j<t-1 ;j++ ) { p*=pp; if(p>10)p%=10; } printf("%d\n",p); } memset(a,'\0',len); } }
另外一个找规律的代码(以诚兄写的。。简洁多了。。)
#include <iostream> #include <math.h> using namespace std; int main() { int T; cin>>T; while(T--) { int n; cin>>n; int ge=n%10,times=n%4; if (times==0) times=4; int ans=(int)pow((double)ge,times)%10; cout<<ans<<endl; } return 0; }
其实这题的主流解法是快速幂:
#include<stdio.h> #include<string.h> int pow(int a,int k) { int rec=1; while(k) { if (k&1) //k%2 { rec*=a; } a*=a; k>>=1; //k/=2 } return rec; } int main() { int a,b,c; scanf("%d%d",&a,&b); c=pow(a,b); printf("%d\n",c); }
根据HDU1061进行的改动:
#include<stdio.h> #include<string.h> int pow(int a,int k) { int rec=1; while(k) { if(a>=10) a%=10; //防止a过大而溢出 if (k&1) //可换为k%2 { rec*=a; if(rec>=10) rec%=10; //取尾数 } a*=a; if(a>=10) a%=10; //取尾数 k>>=1; //可换为k/=2 } return rec; } int main() { int n; int a; scanf("%d",&n); while(n--) { scanf("%d",&a); printf("%d\n",pow(a,a)); } }