Я написал программу, которая делит числа на основные множители, затем сохраняет их в векторе и, наконец, спрашивает, проверять ли результат, умножая их.
Работает так: спроси номер (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-битная.
Когда вы получаете сообщение «количество процентов теперь равно 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
}
Других решений пока нет …