关于阶乘数量级的注意事项

#关于阶乘的大小

利用公式 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表示了

总结一下,int 适用于 1 ! 1! 1! 12 ! 12! 12!long long 适用于 13 ! 13! 13! 20 ! 20! 20!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值