Использование стека для печати простых чисел

Я пытаюсь распечатать все основные факторы любого данного числа пользователем. До сих пор мне удавалось получить код для проверки и печати простых чисел, однако у меня возникли проблемы с перепечаткой номера несколько раз. Пример: введите простое число: 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;
}

-3

Решение

Он возвращает «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 и результат, который говорит, что это не простое число из-за этого.
Если вы удалите «i% 3! = 0» из условия if, вы увидите, что вы получите ожидаемый результат: 3 * 3.

Чтобы избежать этого, я рекомендую написать простую функцию isPrime (int x), которая проверяет, является ли число простым.

2

Другие решения


По вопросам рекламы [email protected]