#关于阶乘的大小
利用公式 e = 1 + 1 1 ! + 1 2 ! + 1 3 ! + … + 1 n ! e=1+\frac{1}{1!}+\frac{1}{2!}+\frac{1}{3!}+…+\frac{1}{n!} e=1+1!1+2!1+3!1+…+n!1,求e的值,要求保留小数点后10位。(2≤n≤15)
错误做法:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
double sum = 1;
cin>>n;
for (int i=n;i>0;--i){
int x = 1; //注意这行!!!!!
for(int j=i;j>0;--j) x*=j; //循环计算阶乘
sum+=(double)1.0/x;
}
printf("%.10lf",sum);
return 0;
}
这个做法只能部分通过,是因为注意的那一行定义的x在计算阶乘时溢出了。
long long x = 1; //修改后的版本
在此总结了一下阶乘的大小问题
首先阶乘函数的递增速度是极快的,从 10 ! 10! 10!开始就有爆炸式的增长。
10 ! = 3628800 10!=3 628 800 10!=3628800;而 11 ! = 39916800 11!=39 916 800 11!=39916800 ; 12 ! = 479001600 12!=479 001 600 12!=479001600 ; 13 ! = 6227020800 13!=6 227 020 800 13!=6227020800(10位数字)
int 数据类型的取值范围为 [ − 2147483648 , 2147483647 ) [-2147483648,2147483647) [−2147483648,2147483647)(10位数字)
显然从13!开始,具体结果已经不能用int表示了
long long数据类型的取值范围为
[ − 9223372036854775808 , 9223372036854775807 ) [-9223372036854775808,9 223 372 036 854 775 807) [−9223372036854775808,9223372036854775807)(19位数字)
显然从21!开始,具体结果已经不能用long long表示了