2

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

它是这样工作的:要求一个数字(num在代码中),然后将其除以 2 及以上。

如果它找到一个divisor模数(当nummod时divisor)为零的数字(代码中的 the),则将该除数存储到一个向量中,然后num通过将其除以 thedivisor并将其存储到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'.

然后程序停止响应,当我按“y”进入时它不起作用。

此外,乘以的数字也不正确;结果是 4294967295 ......在谷歌搜索后,它说它是“使用 32 位(二进制数字)可以获得的最高数字”。但是在我的电脑上,它说操作系统是 64 位的。

4

1 回答 1

2

当您收到“感兴趣的数量现在为 1”的消息时,这意味着temp == 1现在。您应该在此时停止但您继续,因为您的循环错误地与 进行比较divisornum而它应该将其与 进行比较temp

所以现在temp == 1and 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
}
于 2013-05-01T09:04:01.110 回答