关于c语言的一道问题

来源:百度知道 编辑:UC知道 时间:2024/05/26 13:03:21
//求500!的前几位
#include "stdio.h"
#define K 100000 //定义所要求的位数
void main(){
int i=1;
unsigned long fx=1;
while(i<501){
fx=fx*i;
while(fx>K){
fx=fx/10; //当fx大于K时,除以10以保证fx不出范围
}
i++;
}
printf("%ld\n",fx);
}
当K 值改变时(如10000,1000,1000000等),如果程序正确运行,则输出的fx值的前几位不会改变,但运行结果当K=100000时fx=12087,K=10000时fx=1118
.....
而理论上讲fx的值永远不会超过unsigned long的范围(因为2^32>500*100000)所以不应该出现数据溢出问题,但又为何得出的fx值的前几位不一样呢??

楼主的程序思路整个就不对啊。

比如K=10,求500!的最高位。
4!时,24/10=2;
5!时,2*5=10;10/10=1;
6!时,1*6=6;而此时最高位应该是720的7,有问题了吧。

理论上是这样,但是这里K不仅限制了位数,也限制了精度,因为你用的是long,毕竟是整数类型的,当fx>K时对fx截取最后一位你不能保证最后一位是0,如果不是精度就缺失了,而求的阶乘越大这样的缺失也越严重,所以K的值越大,得到的结果越接近真实解