С деление числа на простые множители

Я написал программу, которая делит числа на основные множители, затем сохраняет их в векторе и, наконец, спрашивает, проверять ли результат, умножая их.

Работает так: спроси номер (num в коде), и разделите его на 2 и выше.

Если он находит номер ( divisor в коде) которого по модулю (когда num модификация divisor) равен нулю, запишите этот делитель в вектор и уменьшите num разделив его на divisor и сохранить его в tempи сбросьте делитель на 1 (и последний оператор в while Цикл увеличит его до 2. Если такого числа не найдено, divisor увеличивается, пока не станет больше или равно num, Этот процесс продолжается до divisor больше, чем num,

Вот код:

#include <iostream>
#include <vector>

using namespace std;

int main() {

//num=the number of interest
//divisor=the number dividing the number of interest each time
unsigned long  divisor=2, num, temp ; //num=13699293826d
char c;

vector<unsigned long> divisors;
cout<<"Enter a number: "<<endl;
cin>>num;

//temp stores the number that is reduced each time
temp=num;

while(divisor<=num)
{
if(temp%divisor==0)
{
temp=temp/divisor;
divisors.push_back(divisor);
cout<<"one "<<divisor<<endl;
cout<<"the number of interest is now"<<temp<<endl;
divisor=1;
}
if(divisor==temp&&temp!=1)
{
cout<<"two " << divisor<<endl;
divisors.push_back(divisor);
}

divisor++;
}

if(divisors[0]==num)
{
cout<<"The number: "<<num<<" is prime. ";
}
else
{
cout<<"Its proper divisors are: ";
for(unsigned int count=0; count<divisors.size(); count++ )
{
cout<<divisors[count]<<"\t";
}
}

cout<<"Print out the multiplication? Press 'Y' or 'N'."<<endl;
cin>>c;

if(c=='Y'||c=='y')
{
for(unsigned int count=0; count<divisors.size(); count++)
{
temp*=divisors[count];
cout<<temp<<"\t";
}
}
return 0;
}

Я напечатал некоторые отладки cout заявления.

Проблема, с которой я столкнулся, заключается в следующем: когда число достаточно велико, отладка
Заявление «Номер интереса сейчас», имеет номер 1 после него.
Затем программа вылетает.

Что не так с кодом?

Благодарю.


И да, я использую его на 64 битах.

Пример программы вывода:

    Enter a number:
13699293826
one 3
the number of interest is now: 1431655765
one 5
the number of interest is now: 286331153
one 17
the number of interest is now: 16843009
one 257
the number of interest is now: 65537
one 65537
the number of interest is now: 1

И тогда программа вылетает.

Я также заметил, что первый «главный фактор» 3 неверен, потому что 13699293826, деленное на 3, это 4562761275.333333333333333 …..

редактировать # 2 ——————————————

    temp 65537, divisor 62287

..............omitted output

temp 65537, divisor 65530
temp 65537, divisor 65531
temp 65537, divisor 65532
temp 65537, divisor 65533
temp 65537, divisor 65534
temp 65537, divisor 65535
temp 65537, divisor 65536
temp 65537, divisor 65537
one 65537
the number of interest is now: 1
Its proper divisors are: 3  5   17  257 65537   Print out the                 multiplication? Press 'Y' or 'N'.

И тогда программа перестает отвечать, и она не работает, когда я нажимаю «у» и ввод.

Кроме того, умноженное число не является правильным; результат — 4294967295 … после поиска в Google он говорит, что это «наибольшее число, которое вы можете получить, используя 32-битные (двоичные числа)». Но на моем ПК написано, что операционная система 64-битная.

2

Решение

Когда вы получаете сообщение «количество процентов теперь равно 1», это означает, что temp == 1 сейчас. Вы должны были остановиться на этом этапе, но вы продолжаете, потому что ваш цикл ошибочно сравнивает divisor с numв то время как это должно быть сравнение с temp,

А сейчас temp == 1 а также divisor == 2, и вы будете цикл до unsigned long divisor оборачивается до 0. В этот момент ваш чек if(temp%divisor==0) вызывает деление на ноль. Я ожидаю, что это произойдет для любого входа.


Вы не должны сбрасывать divisorи ваше условие цикла неверно. Ваш цикл должен быть таким:

while( divisor*divisor <= temp)
{
if(temp%divisor==0)
{
temp=temp/divisor;
divisors.push_back(divisor);
cout<<"one "<<divisor<<endl;
cout<<"the number of interest is now"<<temp<<endl;
///// divisor=1;
}
/* ------ if(divisor==temp&&temp!=1)
{
cout<<"two " << divisor<<endl;
divisors.push_back(divisor);
} ------- */
else ////////
divisor++;
}
if( temp > 1)
{
divisors.push_back( temp );
temp = 1;  // <<-------------- ADD THIS
}
2

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

Других решений пока нет …

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