求十进制数的位数

 传统方法

这个方法是很多人初学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),目前依旧是菜狗。。。欢迎交流指正 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值