素数因子分解功能输出

时间:2014-10-29 19:46:56

标签: c++ function prime-factoring

我做了这个函数来计算从用户获得的数字(n)的素数因子分解。我遇到了问题,因为它不会多次打印相同的因素。

例如:

3960的Prime Factorization是:

11 5 3 3 2 2 2

但是我的程序只打印出来:

11 5 3 2

任何人都可以帮我确定原因并帮助我找到解决方案吗?

void primefact(int n)
{ 
    Stack f;
    assert(n >= 0);
    bool prime;

    for(int d = 2; d <= n; d++) // Test for factors > 1
    {
        if(n % d == 0)
        {
            prime = true;
            for(int j = 2; j < d; j++) // Test for prime
            {
                if(d % j == 0) // It is not prime
                prime = false;
            }
            if(prime)
                f.push(d);
        }
    }

    while(!f.empty())
    {
        cout << f.top() << endl;
        f.pop();
    }
}

4 个答案:

答案 0 :(得分:1)

只要分割输入,就必须循环遍历相同的素数。

答案 1 :(得分:0)

  

任何人都可以帮我确定原因吗?

您正在检查n是否可以被d整除,但随后您将继续使用下一个值。如果n可被d整除且d为素数,则您需要实际将n除以d并再次检查d

我们以12为例。素数因子为[3, 2, 2]。您的代码执行此操作:

n = 12, d = 2
n % d == 0? Yes. Push d. d = d + 1   
n % d == 0? Yes. Push d. d = d + 1
n % d == 0? No. d = d + 1
n % d == 0? No. d = d + 1
n % d == 0? No. d = d + 1
n % d == 0? No. d = d + 1
// and so on until d == n

您需要执行此操作的代码:

n = 12, d = 2
n % d == 0? Yes. Push d. n = n/d      // n is 6, d is 2
n % d == 0? Yes. Push d. n = n/d      // n is 3, d is 2
n % d == 0? No. d = d + 1             // n is 3, d is 3
n % d == 0? Yes. Push d. n = n/d      // n is 1 so you're done

答案 2 :(得分:0)

您可能知道自己的算法远非最佳。所以这不会对表现造成太大影响。取代

if(prime)
    f.push(d);

if (prime)
{
    for (int d1 = d; n % d1 == 0; d1 *= d)
        f.push(d);
}

答案 3 :(得分:-1)

素数分解的最简单代码: -

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