这个判断阶乘技术过大的条件不是太理解,求助各位大佬帮小白解惑,在这里先谢过大家。
#include <iostream>#include <climits>
using namespace std;
unsigned long returnFactorial(unsigned short num)throw(const char*);
int main()
{
unsigned short num = 0;
cout<<"请输入一个整数:";
while(!(cin>>num)||(num<1))
{
cin.clear();
cin.ignore(100,'\n');
cout<<"请输入一个整数:";
}
cin.ignore(100,'\n');
try
{
unsigned long factorial = returnFactorial(num);
cout<<num<<"的阶乘值是:"<<factorial;
}
catch(const char* e)
{
cout<<e;
}
return 0;
}
unsigned long returnFactorial(unsigned short num)throw(const char*)
{
unsigned long sum = 1;
unsigned long max = ULONG_MAX;
for(int i=1;i<=num;i++)
{
sum *= i;
max /= i; //就是这个地方,为什么max /= i;就可以判断出num是否在能计算范围内。????????????????????????
}
if(max<1)
{
throw"悲催。。。该基数太大,无法在该计算机上计算出阶乘值。\n";
}
else
{
return sum;
}
} 本帖最后由 jackz007 于 2019-10-20 18:02 编辑
ULONG_MAX 是这台电脑所能表达的 unsigned long 的最大值,利用循环,用这个数从 1 开始除起,每循环一次,除数增 1,一直除到 num,显然,如果最终的商小于 1,那么,就代表从 1 到 num 的阶乘值会超过 ULONG_MAX。
页:
[1]