1058 N的阶乘的长度

基准时间限制:1 秒 空间限制:131072 KB 分值: 0  难度:基础题

输入N求N的阶乘的10进制表示的长度。例如6! = 720,长度为3。
Input
输入N(1 <= N <= 10^6)
Output
输出N的阶乘的长度
Input示例
6
Output示例
3

一、任意数的长度公式:给一个数X,len=log10(X)+1就是X这个数的长度 二、求N!有多少位。因为有斯特林公式,所以求n!的位数即  

log10(n!)=log10(sqrt(2*acos(-1.0)*n))+n*log10(n/exp(1.0));

#include <iostream>  
#include <algorithm>  
#include<string.h>  
#include<stdio.h>  
#include<math.h>  
using namespace std;  
const double PI=3.1415926;  
int main()  
{  
    int t,n,a;  
    while(scanf("%d",&n)!=EOF)  
    {  
        a=(int)((0.5*log(2*PI*n)+n*log(n)-n)/log(10));  
        printf("%d\n",a+1);  
    }  
    return 0;  
}

N!=1*2*3*4*5*............*N;

如果要计算N!后得到的数字,则我们可以知道其等于lgN!+1

lgN!=lg1+lg2+lg3+lg4+lg5+....................+lgN;

但是当N很大的时候,我们可以通过数学公式进行优化:(即Stirling公式)

N!=sqrt(2*pi*N)*(N/e)^N;(pi=3.1415926=acos(-1.0),e=2.718)

lgN!=(lg(2*pi)+lgN)/2+N*(lgN-lge);


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值