Мне нужно найти основные факторы числа, которое вводит пользователь
Пример:
Введите число: 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++
Вы почти на месте — вам просто нужно переместить этот блок
if (flag == false )
cout << i << ", " ;
flag = false ;
в ваш
if (userInput % i == 0)
блок (вы хотите печатать только цифры, которые являются делителями вашего входного числа), и все должно быть хорошо.
вам не нужно проверять на порядочность найденные вами делители, если вы делите их из числа по мере их нахождения, перечисляя кандидатов в порядке возрастания:
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
Найденные простые множители входного числа выводятся также в порядке возрастания.
Вы пытались отладить (даже мысленно), что происходит в вашей программе? Я сомневаюсь в этом, иначе вы бы заметили следующее:
if (userInput % i == 0)
будет ложным для всех делителей. Это означает, что вы будете идти прямо к чеку
if (flag == false )
что верно, так как вы не изменили флаг на true, и, следовательно, вы ошибочно указали число как главный фактор.
Вы также должны рассмотреть угловые случаи. Например, главные факторы простого числа — это только само простое число (которое вы никогда не сможете получить, так как никогда не достигнете его (i < userInput;
)
Относительно вашего отсутствия функциональных ограничений: вы не можете избежать функций, или ваш код ничего не сделает. Однако вы можете избежать вещей, которые выглядят как вызовы функций (выглядят как name()
).
Устранить sqrt
а также ceil
Вы должны изменить условия на i2 * i2 <= prime