c++ - C 将一个数分解为质因数

标签 c++ math prime-factoring

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

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

如果它发现一个数字(代码中的divisor)其模(当num mod divisor)为零,则存储该除数转化为一个 vector ,通过除以 divisor 来减少 num 并将其存储到 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) 会导致除以零。我希望任何输入都会发生这种情况。


您不应该重置除数,并且您的循环条件是错误的。你的循环应该是这样的:

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/

相关文章:

c++ - 在 main 外部和变量声明之前调用 srand

c++ - 为什么复制构造函数被调用了 25 次,而插入循环只迭代了 10 次?

python - 如何将函数应用于列表中的每个元素,然后列出输出?

performance - 一个数不小于另一个数的约数的个数

Haskell 不评估 Lazily takeWhile

c++ - Fmod 作为 While 循环条件错误

math - 如何重新采样/重新组合光谱?

java - 牛顿法计算速率

java - 将double转换为不带小数位的String的最佳方法

c++ - 指向指针或引用的迭代器 - 错误