我编写了一个程序,将数字分解为主要因子,然后将其存储在 vector 中,最后询问是否通过将它们相乘来验证结果。
它是这样工作的:要求输入一个数字(代码中的num
),然后将其除以2并向上取整。
如果找到模数(当divisor
mod num
时)为零的数字(代码中的divisor
),则将该除数存储为 vector ,并通过除以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是4667761275.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'.
然后程序停止响应,并且当我按“y”并输入时它不起作用。
另外,相乘的数字也不正确;结果是4294967295 ...经过谷歌搜索后,它说“这是使用32位(BInary digiTS)可以得到的最高数字”。但是在我的PC上,它表示操作系统是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
}
关于c++ - C将数分解为素数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16312166/