【问题标题】:Finding factors of a number. Not getting accurate results求数的因数。没有得到准确的结果
【发布时间】:2023-03-20 22:50:02
【问题描述】:

有人可以帮助纠正我的算法吗?我已经在几个数字上对其进行了测试,但它没有输出完整的因式分解。对于具有大量因子的数字,它完全失败了。

int num = 20;

for(int i = 2; i <= num; i++)
{
    if(num%i == 0)
    {
        cout << i << endl;
        cout << num << endl;
        num = num/i;    
    }
}

编辑:提供的两个答案不起作用,仍然没有得到完整的结果。

EDIT2:除数 VS 因子

【问题讨论】:

  • 只是一个旁注:请尽量在未来更精确。首先,这不是“不准确”,而是不完整的结果。尝试为示例添加预期输出(例如“如果输入为 15,则输出应为 1、3、5、15,但我只得到......”)。您不需要编辑说答案不是您想要的,每个答案下方都有一个评论部分,正是为了这个目的。不要误解我的意思:你的问题很好,但只要再努力一点,你就能让大家更容易理解你想要什么,你会得到更好的答案!

标签: c++


【解决方案1】:

从您对@Luchian Grigore 的评论来看,您将除数(素数)分解混淆了。一个数的除数是所有num % i == 0 为真的数。因式分解意味着通过较小数字的乘积获得num 的表示。如果你想要分解的唯一性,你通常使用素数分解。

要获得所有除数,您的代码应该是

for ( int i = 1; i <= num; ++i ) // note that 1 and num are both trivially divisors of num
{
    if ( num % i == 0 ) // only check for divisibility
    {
        std::cout << i << std::endl;
    }
}

为了得到(质数)分解,它是

for ( int i = 2; i <= num; ++i )
{
    while ( num % i == 0 ) // check for divisibility
    {
        num /= i;
        std::cout << i << std::endl;
    }
    // at this point, i cannot be a divisor of the (possibly modified) num.
}

【讨论】:

    【解决方案2】:

    问题是即使 i 是一个除数,你也会增加它,除非你找到它的所有出现,否则你不应该这样做。

    因此,对于 4,您将获得 2 两次。但是在遇到前 2 个之后,您退出循环,因为 i 递增到 3,num 变为 2。

    以下应该有效:

    for(int i = 2; i <= num; )
    {
        if(num%i == 0)
        {
            cout << i << endl;
            cout << num << endl;
            num = num/i;    
        }
        else
        {
            i++;
        }
    }
    

    【讨论】:

    • 您好,感谢您的回复。我将其 c/p 到我的代码中,但我仍然没有得到准确的结果。对于有 16 个因子的数字 378,我只返回 10 个,其中 2 个被吐出两次(3 和 7)。
    • @BobJohn,数字 378 有 16 个除数,但只有 5 个因数(3 个不同)。找到除数是一个不同的问题。
    【解决方案3】:
    for(int i = 2; i <= num; i++)
    {
        if(num%i == 0)
        {
            cout << i << endl;
            cout << num << endl;
            num = num/i;    
            i--; // Add this to account for multiple divisors
        }
    }
    
    for(int i = 2; i <= num; i++)
    {
        if(num%i == 0)
        {
            cout << i << endl;
            cout << num << endl;
        }
    }
    

    【讨论】:

    • 当它到达一个除数时肯定会陷入循环吗?
    • 这不起作用。它给了我与其他答案相同的结果,但它并没有给我所有的因素。
    • @BobJohn 这给出了所有因素,从您的 cmets 看来,您正在寻找所有 divisors,我将用它来编辑我的答案。
    • @eq- 我这样做是为了保持“典型”的 for 循环结构。
    【解决方案4】:

    这应该可行。注意,移动构造函数应该使用 c++11,否则你会想要传入一个 std::list& 来代替。

    std::list<int64_t> factor(int64_t f)
    {
        std::list<int64_t> factors;
        for(int64_t ii = 2; ii<=f; ii++) {
            while(f % ii == 0) {
                f = f/ii;
                factors.push_back(ii);
            }
        }
    
        return factors;
    }
    

    【讨论】:

    • 大多数 C++98 编译都有 RVO。通常也应该真正使用 std::vector 而不是 std::list。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多