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