我试图用户打印出任何给定数字的所有素因子。到目前为止,我能够获得检查和打印素数的代码,但是我遇到了多次重新打印数字的问题。例如:输入素数:9,程序打印:3 * 3
#include <iostream>
#include <cmath>
#include <stack>
using namespace std;
int main()
{
int number;
stack<int> PrimeFactor;
cout << "Please enter an integer: ";
cin >> number;
cout << endl;
cout << "The prime factors of " << number << " in descending order are: ";
if((number % 2) == 0)
PrimeFactor.push(2);
if((number % 3) == 0)
PrimeFactor.push(3);
if((number % 5) == 0)
PrimeFactor.push(5);
if((number % 7) == 0)
PrimeFactor.push(7);
if((number % 11) == 0)
PrimeFactor.push(11);
for (int i = 2; i <= sqrt(number); i++)
{
if (number % i == 0 && i % 2 != 0 && i % 3 != 0 && i % 5 !=0 && i % 7 != 0 && i % 11 != 0)
{
PrimeFactor.push(i);
}
}
while(!PrimeFactor.empty())
{
cout << PrimeFactor.top() << " * ";
PrimeFactor.pop();
}
cout << endl;
return 0;
}
答案 0 :(得分:2)
它返回“3 *”,因为3是唯一被推入堆栈的数字,这意味着您使用的逻辑是错误的。
这样想:对于用户输入的数字,你必须找到可以除数的第一个素数,然后对除法的结果做同样的事情,依此类推。
一个非常简单的伪代码:
number = X;
can 2 divide X?
yes -> push 2; Y = X/2;
can 2 divide Y?
no
can 3 divide Y?
no
can <next prime> divide Y?
yes -> push <next prime>; Z = Y/<next prime>
这意味着你的循环计数器“i”应该递增到下一个素数,而不是一个。
完美指出错误: 当i = 3时,条件i%3!= 0失败,3没有被推入堆栈。 你不应该测试一个数字是否是它自己的主要分配(这是你在if条件下做的事情),因为你总是得到0并且结果表明它不是素数因为这个。 如果你从if条件中删除“i%3!= 0”,你会看到你得到你期望的结果:3 * 3.
为避免这种情况,我建议编写一个简单的isPrime(int x)函数来检查数字是否为素数。