标题:这个程序原意是想算1!+2!+3!+……+99!来着,但是结果却是80303791,很明显 ...
只看楼主
civilherui
Rank: 2
来 自:陕西榆林
等 级:论坛游民
威 望:2
帖 子:67
专家分:97
注 册:2015-1-18
结帖率:100%
已结贴  问题点数:4 回复次数:12 
这个程序原意是想算1!+2!+3!+……+99!来着,但是结果却是80303791,很明显不对啊,检查不出程序问题,精确度应该有问题,求教单身怎么改?
这个程序原意是想算1!+2!+3!+……+99!来着,但是结果却是80303791,很明显不对啊,检查不出程序问题,精确度应该有问题,求教单身怎么改?
#include<stdio.h>
main()
{
    int number,i;
    long factorial,m;
    m=0;
    factorial=1;
    for(number=1;number<=99;number++)
    {
         factorial=factorial*number;
         if(number%2==0) continue;
         m=m+factorial;
        
    }
    printf("the sum=%ld",m);
}
搜索更多相关主题的帖子: number 单身 
2015-01-27 19:41
young
Rank: 3Rank: 3
等 级:论坛游侠
威 望:2
帖 子:223
专家分:160
注 册:2004-9-5
得分:1 
应该是超出数据范围了,我在VC用64位数据,是可以显示的
#include<stdio.h>
main()
{
    int number,i;
#ifdef WIN32
    unsigned __int64  factorial,m;
#else
    unsigned long long factorial,m;
#endif
    m=0;
    factorial=1;
    for(number=1;number<=99;number++)
    {
         factorial=factorial*number;
         //if(number%2==0) continue;
         m=m+factorial;
        
    }
    printf("the sum=%I64d",m);
}

如果你爱C语言,请你爱指针; 如果你爱指针,请你爱指针的指针;
2015-01-27 20:05
抗压吧
Rank: 1
等 级:新手上路
帖 子:4
专家分:3
注 册:2015-1-27
得分:0 
不知道你加if(number%2==0) continue;干嘛,用不到。而且long型范围达不到这个值。应该用unsigned long定义。
2015-01-27 20:15
civilherui
Rank: 2
来 自:陕西榆林
等 级:论坛游民
威 望:2
帖 子:67
专家分:97
注 册:2015-1-18
得分:0 
回复 2楼 young
你的显示结果大概有多少位?
光是99的阶乘,假如90个10相乘就是91位,你的显示结果是不是有几百位?
我把你那个程序运行后显示结果是1005876315485501977,用的是c-free。很明显我的运行结果还是错的。

我走向的将是机械、电子、编程的集成之路。
2015-01-27 20:24
civilherui
Rank: 2
来 自:陕西榆林
等 级:论坛游民
威 望:2
帖 子:67
专家分:97
注 册:2015-1-18
得分:0 
回复 3楼 抗压吧
哦,不好意思把题给抄错了,是只有奇数的阶乘和,所以有那个语句。
即使这样unsigned long应该也是不够用的吧,位数应该有几百位。

我走向的将是机械、电子、编程的集成之路。
2015-01-27 20:26
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
得分:1 
用long型数,到14就溢出了(不报错,可以通过比较14!<13!来判断溢出(正常情况下14!>13!,溢出后就变小了),用double型数,可以得到近似数9.42689*10^153,只能得到近似结果,如要精确,可能要写个大数乘法的函数,需要512bit,就是long long long long...long(16个)型数。

能编个毛线衣吗?
2015-01-27 21:10
civilherui
Rank: 2
来 自:陕西榆林
等 级:论坛游民
威 望:2
帖 子:67
专家分:97
注 册:2015-1-18
得分:0 
回复 6楼 wmf2014
用double估值我编辑后是9033584e+155么,还和你的不一样,
还有那个那么多long怎么写进程序里面?你把我的程序修改一下。
万分感谢。

我走向的将是机械、电子、编程的集成之路。
2015-01-27 21:22
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
得分:1 
如果用现成的大数库写非常简单

结果是这个
933358357530259404899649452203330841414181273099622712464375347290843915456047571923795747224123220549817374436563436798611989742138867497898583379392681647

当然 如果你不用现成的大数库就只能自己写了
2015-01-28 01:52
诸葛欧阳
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:流年
等 级:贵宾
威 望:82
帖 子:2790
专家分:14619
注 册:2014-10-16
得分:1 
为什么不把数放在数组中?

一片落叶掉进了回忆的流年。
2015-01-28 02:41
诸葛欧阳
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:流年
等 级:贵宾
威 望:82
帖 子:2790
专家分:14619
注 册:2014-10-16
得分:0 
为什么不把数放在数组中?把一个数用字符串表示

一片落叶掉进了回忆的流年。
2015-01-28 02:43



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-441515-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.015993 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved