计算N!的位数

问题 S: 数学之美

时间限制: 1 Sec   内存限制: 128 MB
提交: 118   解决: 37
[ 提交][ 状态][ 讨论版]

题目描述

 数学起源于人类早期的生产活动,古巴比伦人从远古时代开始已经积累了一定的数学知识,并能应用实际问题.从数学本身看,他们的数学知识也只是观察和经验所得,没有综合结论和证明,但也要充分肯定他们对数学所做出的贡献。

同时编程与数学也是分不开的,今天你需要解决一个数学问题。

请计算N!的位数,其中N!=1*2*3*...*N. 规定0!=1。

输入

 输入N,0<=N<=10^6 (多组输入数据)

输出

 N!的位数。

样例输入

23
233
2333
23333

样例输出

23
452
6847
91788

任意一个正整数a的位数
等于(int)log10(a) + 1;为什么呢?下面给大家推导一下:

  对于任意一个给定的正整数a,
  假设10^(x-1)<=a<10^x,那么显然a的位数为x位,
  又因为
  log10(10^(x-1))<=log10(a)<(log10(10^x))
  即x-1<=log10(a)<x
  则(int)log10(a)=x-1,
  即(int)log10(a)+1=x
  即a的位数是(int)log10(a)+1

我们知道了一个正整数a的位数等于(int)log10(a) + 1,
现在来求n的阶乘的位数:
假设A=n!=1*2*3*......*n,那么我们要求的就是
(int)log10(A)+1,而:
	log10(A)
        =log10(1*2*3*......n)  (根据log10(a*b) = log10(a) + log10(b)有)
         =log10(1)+log10(2)+log10(3)+......+log10(n)
现在我们终于找到方法,问题解决了,我们将求n的阶乘的位
数分解成了求n个数对10取对数的和,并且对于其中任意一个数,
都在正常的数字范围之类。

总结一下:n的阶乘的位数等于

(int)(log10(1)+log10(2)+log10(3)+......+log10(n)) + 1

#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
#include <stdio.h>
#include<iomanip>
#include<cfloat>
#include<string>
#include<vector>
using namespace std;

int main()
{
	int n;
	double num;
	while (scanf("%d", &n) != EOF)
	{
		num = 0;
		for (int i = 1; i <= n; i++)
			num += (double)log10(i);//转化为double类型否则会出错
		
		cout << (int)num+1 << endl;
		
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值