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

猜你喜欢

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