问题 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;
}