我用C语言写的求n!的程序 在验证时怎么当n大于8时输出的结果是负数啊

我用C语言写的求n!的程序 在验证时怎么当n大于8时输出的结果是负数啊
这是程序
#include<stdio.h>
main()
{
int counter,number;
long sum;
printf("Please enter a number:");
scanf("%d",&number);
sum=1;
for(counter=1;counter<=number;counter++){
sum=sum*counter;
}
printf("The sum is %d\n",sum);
system("pause");
}
我是用Turbo 2.0环境下编写和验证的 n取1-7时输出结果都正确 当n取大于7的整数时输出结果就不对了

第1个回答  2009-08-19
首先,不建议用TC,在Windows下用VC6或者免费的软件C-free吧

其次,最好事先估计一下使用变量的值,像这样明显会溢出的

给你补充一点小贴士吧:

*****************************************************************

在C语言当中,比如2(十进制)转换成二进制就是10

如果是整形,2个字节,8位

在内存中就是:00000010(就是十进制的2)

它的反码是:11111101(看数字,体会反码的意思)

然后补码就是:11111110(就是在反码的情况下+1,你看看对不对呢?)

所以,int型的-2就是11111110了

*****************************************************************

你所说的负数,就是溢出的关系,就像汽车里程表一样,比如它的极限值是200公里,当你行驶超过200公里,它就又从0公里开始了,所以当你的变量sum超过了所求的值,它就变成负数了

再者,你在输出sum的时候用的是“%d”而不是“%ld”,“%ld”表示长整型,“%d”只表示整型。为了防止这个问题发生,最好将变量定义成long long型,在输出时使用“%ld”,而且使用新一点的编译器比较好,毕竟TC给整型只分配2个字节,VC分配4个字节,而且新的编译器支持long long型,TC我不太清楚支不支持,可能不支持吧
第2个回答  2009-08-30
好象是改了也白搭,在Turbo 2.0环境下整型和长整型都是2字节(最大值是32767,再大时"输出结果就不对了"至少俺家的机子是这样,就这一点曾经困扰了我好长时间才发现,呵呵,和课本上讲的不一样啊)建议改成长整型后在VC++6.0下调试,8!=40320本回答被提问者采纳
第3个回答  2009-08-20
因为阶乘是个增长很快的运算,很快就会超出C语言的整型数范围.你应该用浮点数来保存结果,但这样的话就看不到精确的数字了.

如果你真的想看到很大的n的阶乘的精确结果,那你只有用字符串来模拟整数运算了.
第4个回答  2009-08-19
输出超出范围!
你是用什么软件写的啊?Tubor C/C++吗,
在Tubor环境中 int只占两个字节 ,-32768~32767
用%d输出也是 -32768~32767范围!
你定义的sum是;long型的,四个字节!应该用把printf("The sum is %d\n",sum);中 %d改为%ld 输出范围大些
当 8!= 40320 就已经大于32767!

在VC6.0++中 int 占了四字节 跟long一样!
第5个回答  2009-08-19
我来晚了...
n=8时sum超过了int的范围
把int换成long long型 (中间有空格)

即:
long long sum;

long long型输出:
printf("%lld",sum);

如果TC不支持long long型数据,就换个编译器.

参考资料:手打的..

相似回答