1. 程式人生 > >T^T問題(18.11.25)

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

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