C将一个数分解成质因数

C factoring a number into prime factors

本文关键字:分解 质因数 一个      更新时间:2023-10-16

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

它是这样工作的:请求一个数字(代码中的num),并将其除以2并向上。

如果它发现一个数(代码中的divisor)其模(当num mod divisor时)为零,则将该除数存储到一个向量中,并将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等于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位的

当您收到消息"感兴趣的数量现在是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
}