поиск простых множителей заданного числа с ++ без функций

Мне нужно найти основные факторы числа, которое вводит пользователь

Пример:

Введите число: 1430. Основные факторы 1430: 2,5,11,13

Я бы предпочел не использовать функцию, поскольку я еще не рассмотрел ее

Вот мой код

#include <iostream>
#include <iomanip>
#include <cmath>

using namespace std ;

int main ()
{
int count, i , i2 ;
int userInput, prime ;
bool flag = false ;

cout << "Enterr: " ;
cin >> userInput ;
cout << "The prime factors are: " ;
for (i = 2; i < userInput ; i++)
{
if (userInput % i == 0) // this for loop is to check is the counter (i) is a multiple of userInput
{
prime = i;
// the next for loop is to check is the multiple is a prime number
for( i2 = 2; i2< ceil(sqrt(prime))  ; i2++)
{
if (prime % i2 == 0)
flag = true ;
}
}
if (flag == false )
cout << i << ", "  ;
flag = false ;
}

cout<< endl ;

return 0 ;
}

Мой вывод полностью игнорирует второй цикл и просто выводит все целые числа меньше, чем userInput

Мне удалось создать фрагмент кода, который проверяет, является ли число простым числом здесь:

#include <iostream>
#include <iomanip>
#include <cmath>

using namespace std ;

int main ()
{
int userInput, prime ;
int i ;
bool flag = false ;

cin >> userInput ;

for( i = 2; i < static_cast<int>(sqrt(userInput) + 1) ; i++)
{
if (userInput % i == 0)
flag = true;
}

if (flag == false )
cout << "Number is a prime" << endl ;
else
cout << "Number is not a prime " << endl ;

return 0 ;
}

Извините, если есть какие-либо ошибки. Я все еще новичок в C++

2

Решение

Вы почти на месте — вам просто нужно переместить этот блок

  if (flag == false )
cout << i << ", "  ;
flag = false ;

в ваш

if (userInput % i == 0)

блок (вы хотите печатать только цифры, которые являются делителями вашего входного числа), и все должно быть хорошо.

3

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

вам не нужно проверять на порядочность найденные вами делители, если вы делите их из числа по мере их нахождения, перечисляя кандидатов в порядке возрастания:

    for (i = 2; i <= userInput/i;  )
{
if (userInput % i == 0)
{
cout << i << ", ";   // i is a prime factor of the original
userInput /= i;      //   number in userInput
}
else
++i;
}
if (userInput > 1)
{
cout << userInput;       // the biggest prime factor of the original
}                            //   input number

Найденные простые множители входного числа выводятся также в порядке возрастания.

1

Вы пытались отладить (даже мысленно), что происходит в вашей программе? Я сомневаюсь в этом, иначе вы бы заметили следующее:

if (userInput % i == 0)

будет ложным для всех делителей. Это означает, что вы будете идти прямо к чеку

if (flag == false )

что верно, так как вы не изменили флаг на true, и, следовательно, вы ошибочно указали число как главный фактор.

Вы также должны рассмотреть угловые случаи. Например, главные факторы простого числа — это только само простое число (которое вы никогда не сможете получить, так как никогда не достигнете его (i < userInput;)

Относительно вашего отсутствия функциональных ограничений: вы не можете избежать функций, или ваш код ничего не сделает. Однако вы можете избежать вещей, которые выглядят как вызовы функций (выглядят как name()).

Устранить sqrt а также ceil Вы должны изменить условия на i2 * i2 <= prime

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