T^T问题(18.11.25)

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

快速幂不理解的可以自己去查一下

猜你喜欢

转载自blog.csdn.net/qq_42882715/article/details/84485709
T