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

浙公网安备 33010602011771号