小白吟风 发表于 2019-10-20 17:48:07

这个判断阶乘技术过大的条件不是太理解,求助各位大佬帮小白解惑,在这里先谢过大家。

#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:00:09

本帖最后由 jackz007 于 2019-10-20 18:02 编辑

      ULONG_MAX 是这台电脑所能表达的 unsigned long 的最大值,利用循环,用这个数从 1 开始除起,每循环一次,除数增 1,一直除到 num,显然,如果最终的商小于 1,那么,就代表从 1 到 num 的阶乘值会超过 ULONG_MAX。
页: [1]
查看完整版本: 这个判断阶乘技术过大的条件不是太理解,求助各位大佬帮小白解惑,在这里先谢过大家。