C将一个数字分解为素数因子

时间:2013-05-01 03:04:13

标签: c++ math prime-factoring

我写了一个程序,将数字计入其主要因子,然后将它们存储在一个向量中,最后询问是否通过将它们相乘来验证结果。

它以这种方式工作:在代码中要求一个数字(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位。

1 个答案:

答案 0 :(得分:2)

当您收到“感兴趣的数量现在为1”的消息时,表示现在为temp == 1。你应该已经停止了,但是你继续,因为你的循环错误地将divisornum进行了比较,而应该将其与temp进行比较。

现在temp == 1divisor == 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
}