C++;因子函数 p>我写C++程序是为了得到一个数的事实,但是当我把一个大数传入它时,它用“INF”返回,我试着添加一个if语句来检查它是否大于数据类型的最大大小,是一个长的双,这不能解决这个问题。有人能帮忙吗?谢谢这是我的密码: long double factoral(long double num) { if (num >= std::numeric_limits<long double>::max() || num < std::numeric_limits<long double>::min()) { return 0; } if (num > 1) { return num * factoral(num - 1); } else { return 1; } } int main() { long double res = factoral(1000); if (res == 0) { std::cout << "The factoral of 1000 is either too large or too small"; } else { std::cout << "The factoral of 1000: " << res; } } long double factoral(long double num) { 如果(num>=std::numeric_limits::max()|| num1) { 返回num*factoral(num-1); } 其他的 { 返回1; } } int main() { 长双精度=因数(1000); 如果(res==0) { std::cout

C++;因子函数 p>我写C++程序是为了得到一个数的事实,但是当我把一个大数传入它时,它用“INF”返回,我试着添加一个if语句来检查它是否大于数据类型的最大大小,是一个长的双,这不能解决这个问题。有人能帮忙吗?谢谢这是我的密码: long double factoral(long double num) { if (num >= std::numeric_limits<long double>::max() || num < std::numeric_limits<long double>::min()) { return 0; } if (num > 1) { return num * factoral(num - 1); } else { return 1; } } int main() { long double res = factoral(1000); if (res == 0) { std::cout << "The factoral of 1000 is either too large or too small"; } else { std::cout << "The factoral of 1000: " << res; } } long double factoral(long double num) { 如果(num>=std::numeric_limits::max()|| num1) { 返回num*factoral(num-1); } 其他的 { 返回1; } } int main() { 长双精度=因数(1000); 如果(res==0) { std::cout,c++,C++,您的结果在返回num*factoral(num-1);处溢出(inf),因此您只需检查周围的限制,如下所示 long double factoral(long double num){ 如果(num>1){ 长双ret=num*factoral(num-1); 如果(ret>=std::numeric_limits::max()) 返回0; 返回ret; } 返回1; } 我还建议您使用类似(未测试代码)的迭代解决方案 long-long-fac(long-long-num){ 长-长ret=

您的结果在
返回num*factoral(num-1);
处溢出(
inf
),因此您只需检查周围的限制,如下所示

long double factoral(long double num){
如果(num>1){
长双ret=num*factoral(num-1);
如果(ret>=std::numeric_limits::max())
返回0;
返回ret;
}
返回1;
}
我还建议您使用类似(未测试代码)的迭代解决方案

long-long-fac(long-long-num){
长-长ret=1;
while(num--)ret*=num;//<此处处理限制
返回ret;
}

您的结果在
返回num*factoral(num-1)
处溢出(
inf
);
因此您只需检查周围的限制,如下所示

long double factoral(long double num){
如果(num>1){
长双ret=num*factoral(num-1);
如果(ret>=std::numeric_limits::max())
返回0;
返回ret;
}
返回1;
}
我还建议您使用类似(未测试代码)的迭代解决方案

long-long-fac(long-long-num){
长-长ret=1;
while(num--)ret*=num;//<此处处理限制
返回ret;
}

斯特林公式给出了阶乘的近似值:
sqrt(2nPi)(n/e)^n
。试着手动计算并与最大允许值进行比较。从1到1000的阶乘大约为10^2600,这对于长时间的双倍来说太大了。参数永远不会溢出(首先通过1000,它不是“大的”)在这个平台上,结果不是太大:。这取决于平台/编译器。还不清楚当一个简单的for循环可以完成这项工作时,为什么要使用递归调用。斯特林公式给出了阶乘的近似值:
sqrt(2nPi)(n/e)^n
。尝试手动计算,并与最大允许值进行比较。从1到1000的阶乘大约为10^2600,这对于长时间的双倍运算来说太大了。参数永远不会溢出(首先通过1000,它不是“大”,然后通过越来越小的数字,直到达到1)。这是溢出的结果。在此平台上,结果不是太大:。这取决于平台/编译器。还不清楚当简单的for循环可以完成此工作时,为什么要使用递归调用。谢谢,我似乎已经用thakee nathees代码对错误进行了排序,感谢帮助和信息,guysThank you,我似乎已经得到了错误排序器d和thakee nathees代码,谢谢你们的帮助和信息,伙计们
long long fac(long long num) {
    long long ret = 1;
    while (num--) ret *= num; //< handle limits here
    return ret;
}