找出一个数字的因素。没有得到准确的结果

时间:2012-08-16 20:37:42

标签: c++

有人可以帮助纠正我的算法吗?我已经在一些数字上测试了它,并没有输出完整的因子分解。对于具有大量因素的数字,它只是完全失败。

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因子

4 个答案:

答案 0 :(得分:12)

根据您对@ 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.
}

答案 1 :(得分:2)

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

所以,对于4,你有两次。但是在你遇到的前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++;
    }
}

答案 2 :(得分:1)

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;
    }
}

答案 3 :(得分:0)

这应该有效。注意,应该使用c ++ 11作为移动构造函数,否则你将要传入一个std :: list&amp;代替。

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;
}