我写了一个程序,将数字计入其主要因子,然后将它们存储在一个向量中,最后询问是否通过将它们相乘来验证结果。
它以这种方式工作:在代码中要求一个数字(num
),并将它除以2和更高。
如果找到一个数字(代码中的divisor
),其模数(当num
mod divisor
)为零时,将该除数存储到向量中,并减少{{1通过将其除以num
并将其存储到divisor
中,并将除数重置为1(并且temp
循环中的最后一个语句将其递增为2.如果没有这样的话找到了数字,while
会增加,直到它大于或等于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;
}
语句。
我遇到的问题是:当数量足够大时,调试 声明“现在的兴趣数量”,跟随它的数字1。 然后,程序崩溃了。
代码有什么问题?
感谢。
是的,我在64位上运行它。
示例程序输出:
cout
然后程序崩溃了。
我也注意到3的第一个“素因子”是不正确的,因为13699293826除以3是4562761275.333333333333333 .....
编辑#2 ------------------------------------------
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
然后程序停止响应,当我按“y”并输入时,它不起作用。
此外,乘以的数字不正确;结果是4294967295 ...在谷歌搜索之后,它说它是“使用32位(BInary digiTS)获得的最高数字”。但在我的电脑上,它说操作系统是64位。
答案 0 :(得分: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
}