C++ 当I';我在加正数?
我得到了一个函数,它计算给定整数的阶乘:C++ 当I';我在加正数?,c++,C++,我得到了一个函数,它计算给定整数的阶乘: long iterFact(long number) { long factorial = 1; for (long i = 1; i <= number; i++) factorial *= i; return factorial; } long iterFact(长数字){ 长阶乘=1; 对于(long i=1;i您不是在添加数字,而是在将它们相乘。实际上,您不是在计算斐波那契序列,而是在计算阶乘;
long iterFact(long number) {
long factorial = 1;
for (long i = 1; i <= number; i++)
factorial *= i;
return factorial;
}
long iterFact(长数字){
长阶乘=1;
对于(long i=1;i您不是在添加数字,而是在将它们相乘。实际上,您不是在计算斐波那契序列,而是在计算阶乘;-)
阶乘增长非常快:20!(2432902008176640000
)不适合系统上的long
(32位,可能是Windows),因此其中一个乘法会导致算术溢出,C标准明确将其描述为未定义行为。在您的系统上,计算可能以模2^32执行,结果可能是负数,但该标准不能保证这一点
切换到类型unsigned long long
,它保证至少有64位,将允许您计算20!
,但很快就会失败,因为21!
。事实上2432902008176640000
略小于2^63-1,所以类型long long
也就足够了。我假设您指的是阶乘,而不是阶乘斐波那契序列
在大多数现代系统中,int
和long
都是32位,最多可以代表20亿左右的数字。20阶乘大约是20亿。尝试使用64位的long-long
。这是一个整数溢出;因为变量是有符号的,而且符号位是最重要的一位,所以在有些时候你的变量溢出了。实际上,20!是一个巨大的数字。你应该尝试将变量声明为无符号长,并将其打印为无符号长。如果sizeof(long)
是4个字节,LONG\u MAX是2^31-1,那么当你计算13!
时就会有整数溢出。有符号整数溢出是指你可以使用不同的数据类型,比如uintmax\u t
,它可以容纳更大的数字,但仍然不足以处理更大的阶乘
看一看
另外:这是签名类型的溢出
int可以是4个字节:-2147483648/2147483647
long可以是8个字节:-9223372036854775808/9223372036854775807
int/long可以是有符号和无符号的整数溢出。此外,它是阶乘而不是斐波那契。因为阶乘增长迅速并突破了整数限制。“我认为这可能是因为数字太长了,但即使将所有内容从int改为long,结果仍然是负数”long
也不是无限的。与其猜测,不如检查每个值,看看你的类型是否足够大。请看数字。2**63
是9223372036854775808
。现在19!
是121645100408832000
(较小),但20!
是2432902008176640000
(较大).你看到问题了吗?@WeatherVane:恐怕你弄错了:2432902008176640000
比9223372036854775808
小,所以它适合大多数现代系统的long
在大多数现代商品系统上。今天开发的大多数现代系统实际上都有16位int
。最好完全避免此类语句。感谢您的更正。随机猜测并不能解决随机猜测引起的问题。这是一种可能的解释。但作为有符号整数溢出调用s未定义的行为,还有许多其他原因。很抱歉回答得不好,我以后在回答问题之前会更加小心。感谢你的精确性,我没有意识到溢出导致了未定义的行为,我以为最重要的部分被忽略了,但最不重要的部分保持连贯性;我运行了few在我的机器上进行测试以观察结果,是的,结果中没有明显的逻辑。在OP的情况下,long
不是64位,但可能只有32位,因此算术溢出。int
可以是1字节或37位,等等。int
或long
都不能无符号。32位long
不能保存<代码>2**32-1
!