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

来源:百度知道 编辑:UC知道 时间:2024/07/04 12:48:13
我用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的整数时输出结果就不对了

好象是改了也白搭,在Turbo 2.0环境下整型和长整型都是2字节(最大值是32767,再大时"输出结果就不对了"至少俺家的机子是这样,就这一点曾经困扰了我好长时间才发现,呵呵,和课本上讲的不一样啊)建议改成长整型后在VC++6.0下调试,8!=40320

首先,不建议用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我不太清楚支不支持,可能不支持吧

我来晚了...
n=8时sum超过了int的范围
把int换成long long型 (中间有空格)

即:
long long sum;