我编写了一个程序,将数字分解为主要因子,然后将其存储在 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。此时您应该已经停止,但是应该继续,因为循环错误地将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
}

关于c++ - C将数分解为素数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16312166/

10-10 22:42