目录
大数阶乘 大数幂乘等的位数以及结果的前几位数。
思路:用对数运算。
log10(1)+...log10(n)=log10(1*2*3*...*n)=log10(m*10^x)=log10(m)+log10(10^x)(1<m<10)
(int)之后就是x,也就是转化阶乘为1*10^x,位数就是x+1。
例如前五位数,最终数字肯定在m里面,所以求出m。ans-(int)ans就是log10(m).
Pow(10,ans-(int)ans)就是m,m是【1,10】的小数,需要前几位,就乘以1e(l-1)即可。
int n;
for(n = 10;n <= 20;n++){
double ans = 0;
for(int i = 1;i <= n;i++) {
ans += log10(i);
}
cout << (int)ans+1<< endl;
cout << (int)(pow(10,(ans-(int)ans))*1e5)<< endl;
}
无限循环小数的分数表示求法:
0.32(692307)()表示循环部分
消掉循环部分:设x:1e8x-1e2x = 32692307-32; x=32692307-32/1e8-1e2 约分-__gcd
cout << (32692307-32)/__gcd(32692307-32,99999900) << endl;
cout << "一"<<endl;
cout << (1e8-1e2)/__gcd(32692307-32,99999900)<<endl;