T^T问题
题目描述:
T^T这个很像一个流泪的表情是不是!其实,它是T的T次方啦~。当T比较大的时候T^T会非常大,现在只要你求这个数的个位就可以啦
Input
输入包括多组测试数据,每个测试数据只有一个数字T(0<T<2^31)
Output
请输出T^T的个位数
Sample Input 1
1
2
3
105
Sample Output 1
1
4
7
5
题目的意思很好理解,就是就t的t次方,然后输出个位上的数字。
这一题一开始的思路是打算用快速幂写,设置两个变量分别储存底数和幂。先将底数对10取余,然后再进行快速幂的运算。但是一开始的代码好像出了点问题,超时了。就换了一种思路。
第二种思路其实就是忽然发现吧输入的那个数对100取余后再进行计算,计算结果与直接对那个数进行运算是一样的。
下面贴代码:
#include<stdio.h>
int main()
{
int a,i,b,a1;
while(scanf("%d",&a)!=EOF)
{
a%=100; //先对a取余
b=a;
a%=10; //对b赋值后再次对a取余
a1=a;
for(i=0;i<b-1;i++)
a=(a*a1)%10; //直接求幂
printf("%d\n",a);
}
return 0;
}
后来又听说快速幂没有问题,就又用快速幂写了一遍,发现过了,才知道是自己第一次代码有问题。
下面是快速幂的代码:
#include<stdio.h>
int main()
{
int a,i,b,a1,t,y;
while(scanf("%d",&a)!=EOF)
{
b=a; //用b储存幂
a%=10; //先对a取余
t=1;
y=a;
while(b!=0) //进行快速幂求解
{
if(b&1==1) //判断二进制的最后一位是否为1
t=t*y%10;
y=y*y%10;
b=b>>1; //对b进行位运算,右移一位
}
printf("%d\n",t);
}
return 0;
}
快速幂不理解的可以自己去查一下