所以我用c++写了一个程序,假设从1开始无休止地打印数字的阶乘。它打印了第一个一些数字,如预期的正确阶乘值,但在此之后,它只是最终得到负值和程序被终止,由于条件提到。但我不确定一个好的阶乘程序如何最终得到负值。
#include<iostream>
using namespace std;
int main(){
int a = 1;
int c = 1;
while(a>0){
cout<<(a*c)<<endl;
a = a*c;
c = c+1;
}
return 0;
}
我期望阶乘的结果从1到永远是无穷的。
结果我得到了-
1
2
6
24
120
720
5040
40320
362880
3628800
39916800
479001600
1932053504
1278945280
2004310016
2004189184 //Number Decreased Instead of Increasing
-288522240 //Now It is negative
2条答案
按热度按时间xqk2d5yq1#
int
是有符号类型。阶乘变得足够大,以至于溢出(超过int
可以存储的最大值)。当他们这样做时,你开始看到似乎没有意义的答案。这可以通过一个简单的演示程序很容易地看到:
如果你想看到更大的阶乘结果,你需要使用更大的整数类型,可能是更大的 unsigned 整数类型。
如果我们这样做,我们为自己购买了一些额外的空间来生成更大的阶乘。
jv4diomz2#
标准的C++整数类型有一个定义的范围值,以便保持在由架构定义的位数(32位,64位等)。您可以通过搜索min and max values for types(它可能取决于体系结构)或使用更现代的东西(如numeric_limits class template)来检查它们。
如果你计算一个更大(或更小)的数字,你会有一个整数溢出,这是由于进程中数字运算的逻辑实现。你可以有不确定的行为,或有趣的附带影响。一种典型的行为(感谢@Aconcagua)行为可能是应用程序崩溃。
如果你需要处理比这个更大的数字,你应该依赖一个专用的库,比如boost::multiprecision,它有表示任意大小的数字的类。注意,显然因为数字较大,它们以库逻辑定义的特殊方式处理,并且通常比内置类型慢。如果它可能是一个问题取决于你和你的应用程序的性能要求。