一道简单的C语言题。有关double的溢出
发布网友
发布时间:2022-06-01 18:11
我来回答
共3个回答
热心网友
时间:2023-10-10 20:07
double倒也不会溢出,而是会有精度误差。但你直接求阶乘的话int64可能溢出。
这道题关键在于怎么求组合数C(N, a),其实可以不用求阶乘,也可以不溢出
有一个公式:C(N, a) = C(N-1, a-1) + C(N-1, a); (a != 0 && a != N)
根据这个公式就可以不溢出递推求出很大的组合数了,试试吧~
没看见最下面写着“递推求解专题练习”么?
你是杭电的么?HDU的acm越来越红火了~
热心网友
时间:2023-10-10 20:08
当用最大的数据作为输入:20 20
的时候,输出应该是:895014631192902121
而你的程序输出却是:895014631192902400
所以,不对啊。
原因是:产生了向下溢出,也就是把精度丢失了
不需要算阶乘的。直接用错排公式,和组合数公式。
组合数,比阶层要小很多,所以,不会溢出。
热心网友
时间:2023-10-10 20:08
printf("%.0f\n",sum);溢出应该是发生在这里.改为
printf("%.0lf\n",sum);双精度浮点输出