传统方法
这个方法是很多人初学c语言的写法。
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n,k=0;//n表示输入的数,k表示位数
scanf("%d",&n);
while(n!=0)//while循环会一直执行,直到n变为0
{
k++;
n/=10;
//移除最低位,例如123经过一次循环后变为12,在经过一次循环后变为1,当它变为0时循环结束。
}
printf("%d\n",k);
return 0;
}
位数公式
一个超快的方法,一个数的位数可以看作是它的对数(以10为底)向下取整并加1。
计算一个数x有多少位,用(int)log10(x)+1就可以了
比如:100是3位数,(int)log10(100)+1就等于3
999是3位数,(int)log10(999)+1也等于3
log10(100)=2,log10(999)=2.9995654...(用int强制类型转换后取2),log10(1000)才等于3
注意:cmath的log实际上默认ln
例题
林大oj 26 计算阶乘位数
#include <bits/stdc++.h>
#define e 2.7182818284//定义自然对数的底数 e
#define pi acos(-1.0)//定义圆周率 π
using namespace std;
int main()
{
int n,t;
cin>>t;
while(t--)
{
cin>>n;
printf("%d\n",(int)(log10(2*pi*n)*0.5+n*log10(n/e))+1);//斯特林公式+位数公式
}
return 0;
}
log10(2 * π * n) * 0.5:这一部分可以用来估计 n! 的数量级。
在 n 足够大时,n! 的数量级大约为 10^(log10(2 * π * n) * 0.5)。
n * log10(n / e):这一部分可以用来根据斯特林公式估计 n! 的精确值。
林大oj 877 求位数
本题求a^b的位数,输入数据有多组,每组2个数a,b( 1<=a,b<=100000000)
#include <bits/stdc++.h>
using namespace std;
int main()
{
int a,b;
while(cin>>a>>b)
cout<<(int)(b*log10(a))+1<<endl;
return 0;
}
这篇博客是刚进CSDN的时候写的,那时我还年轻(不是),现在学得更多了,于是又修改了一下(大改hhh),目前依旧是菜狗。。。欢迎交流指正