使用堆栈打印素数

时间:2014-09-17 00:13:15

标签: c++ stack prime-factoring

我试图用户打印出任何给定数字的所有素因子。到目前为止,我能够获得检查和打印素数的代码,但是我遇到了多次重新打印数字的问题。例如:输入素数: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;
}

1 个答案:

答案 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)函数来检查数字是否为素数。