1. 程式人生 > >T^T(2)(18.11.26)

T^T(2)(18.11.26)

T^T(2)

Description

TT這個很像一個流淚的表情是不是!其實,它是T的T次方啦~。當T比較大的時候TT會非常大,現在只要你求這個數一共有多少位就可以了。

Input

輸入包括多組測試資料,每個測試資料只有一個數字T(0<T<2^31)。

Output

請輸出T^T的一共有多少位數。

Sample Input 1

3
5

Sample Output 1

2
4

這一題先想到的是求一個數的位數可以對這個數取以十為底的對數,取整後再加上1即可

記得之前做過一道求n!的位數的題,那一題是把n!寫成了123*……*n,由對數運算公式把乘積轉化成加法運算。

這一題最開始的思路也是打算這麼做,所以就寫了一個快速冪的模板,然後稍微進行了一下修改。

下面把程式碼貼出來大家可以看一下:

#include<stdio.h>
#include<math.h>
int main()
{
    double a,t;
    long long n;
    while(scanf("%dll",&n)!=EOF)
    {
        a=1;  //賦值為1最後可以不用加
        t=n;
        while(n!=0)
        {
            if(n&1==1)
            a+=log10(t);  //這裡進行了修改
            t*=t;
            n>>=1;
        }
        printf("%lld\n",(long long)(a));
    }
    return 0;
}

注意:在儲存對數運算結果的時候要用浮點型別儲存

但這麼做當我輸入到256的時候會打印出來特別奇怪的數,不知道是超範圍了還是什麼,所以就不用這個思路了。
至於這個方法到底為什麼錯希望大佬能給指出來。

然後發現其實還有這麼一個公式:log(10)(x^x)=xlog(10)x

就直接進行計算就可以了。

下面貼程式碼:

#include<stdio.h>
#include<math.h>
int main()
{
    double a,t;
    long long n;
    while(scanf("%lld",&n)!=EOF)
    {
        a=n*log10(n);
        printf("%lld\n",(long long)(a+1));
    }
    return 0;
}