抱歉英语不好。
所以我的问题是我需要从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内存变大之前停止! 希望大家都能理解我的问题并帮助我解决这个问题。
答案 0 :(得分:2)
如果factorial2 > UINT_MAX / (s+1)
,则无法计算下一个因子。
顺便说一下,您应该unsigned int
使用factorial2
答案 1 :(得分:2)
在计算列表中的下一个阶乘之前,请查看前一个阶乘是否大于UINT_MAX / i
。如果是,您知道下一个乘法将超出界限。
答案 2 :(得分:2)
在32位有符号整数中,12!是最大的可能。
您可以通过
进行检查if (INT_MAX / fact_so_far < n)
{
std::cout << "Max factorial " << n-1 << std::endl;
}
[此代码在到达&#34时STOPS;无法计算&#34;,因为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_UINT
不是unsigned int
的最大值,不是int
的最大值[通常只有一半]。
编辑解释逻辑:
这里的逻辑是,如果我们将INT_MAX
除以我们当前的阶乘值,它应该产生一个大于n
[下一个阶乘的当前乘数]的值。
作为一个简单的步骤,我们选择一个127的MAX_INT:
初始状态:
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.
答案 3 :(得分:1)
您正在将signed int与未签名的int进行比较,即您正在执行i&lt; UINT_MAX(这是unsigned int的最大值),这是错误的,将导致溢出和错误的条件检查。
答案 4 :(得分:0)
所以我最终用我的代码完成了这个。现在它有效,但它不是真的很好。也许有一天某人需要这样的事情作为他自己的最大因子计划的开始。第一个程序将要求您插入一个随机数,然后计算其阶乘(仅在max int边界)。然后它打印出所有可能的int factorial。它的节目只有11个!最大但最大值是12!我添加了阶乘12! manualy,因为if语句不能打印出数字12,因为它最多打印一个。最后,程序会向您显示intiger的最大可能因子。
#include <iostream>
#include<climits>//
#include <cmath>
using namespace std;
int main() {
int k, max,s;
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( s = 1; s<=uval; ++s) {
factorial2 *= s;
max=factorial2;
if( s <= uval / factorial2 ){
cout <<" \nkoeficenta " << s << " faktorials ir ==> " <<factorial2;
}
else {
break;
}
}
cout <<" \nkoeficenta " << s << " faktorials ir ==> " <<factorial2;
cout <<" \nMaksimalais faktorials ir skaitla " << s << " faktorials ==> " <<max;
return 0;
}
这就是程序的样子!
![PROGRAMM] [1]