gpt4 book ai didi

c++ - 找到整数允许的最大阶乘 n! C++

转载 作者:太空宇宙 更新时间:2023-11-04 15:14:58 24 4
gpt4 key购买 nike

抱歉英语不好。
所以我的问题是我需要找到从 1 开始的所有可能的阶乘。当 Int 使用了最大内存并打印出最大阶乘值时,我需要它停止。我的代码非常简单,但我不知道如何在达到最大 Intiger 值时停止循环。

 #include <iostream>
#include<climits>//
#include <cmath>
using namespace std;

int main() {

int k,n=0;
unsigned int factorial = 1;
unsigned int factorial2=1;
unsigned uval=INT_MAX;

cout << "Ievadi koeficentu k: ";
cin >> k;
for(int i = 1; i<=k; ++i) {
factorial *= i;
}
cout << "Ievadita koeficenta " << k << " faktorials " << " = " <<factorial;

cout << "\nVisi iespejamie faktoriali no 1 - n: ";
for(int s = 1; s<=uval; ++s) {

factorial2 *= s;
if( s < uval / factorial2 ){
cout <<" \nkoeficenta " << s << " faktorials ir ==> " <<factorial2;
}
}




return 0;
}

问题在于循环将计算所有 UINT_MAX 值的阶乘,并且大部分输出将为 0,因为内存过载。但它应该在 UINT_MAX 内存变大之前停止! 希望你们都能理解我的问题并帮助我解决这个问题。

最佳答案

在 32 位有符号整数中,12!是最大的可能。

你可以通过这样做来检查

if (INT_MAX / fact_so_far < n)
{
std::cout << "Max factorial " << n-1 << std::endl;
}

[此代码在到达“无法计算”时停止,因为 INT_MAX/fact_so_far 不会乘以而不会溢出]。

if (INT_MAX / fact_so_far >= n)
{
fact_so_far *= n;
}
else
{
std::cout << n << " is too large to calculate factorial" << std::endl;
}

将是执行此操作的另一种方法。 [显然有合适的循环来递增 n]

不是 MAX_UINTunsigned int 的最大值,不是 int 的最大值 [它通常是那个值的一半]。

编辑解释逻辑:

这里的逻辑是,如果我们将 INT_MAX 除以我们当前的阶乘值,它应该产生一个大于 n [下一个阶乘的当前乘数].

作为示例的简单步骤,我们选择 MAX_INT 为 127:

初始状态:

factorial = 1, n = 1; 

步骤:

n = 2, MAX_INT / factorial = 127 -> factorial *= n => 2
n = 3, MAX_INT / factorial = 63 -> factorial *= n => 6
n = 4, MAX_INT / factorial = 21 -> factorial *= n => 24
n = 5, MAX_INT / factorial = 5 -> factorial *= n = 120
n = 6, MAX_INT / factorial = 1 -> FAIL - will overflow.

关于c++ - 找到整数允许的最大阶乘 n! C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35753224/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com