0

我正在寻找一种算法来帮助我拆分数字N就像
N = (p 1 a ) (p 2 b ) .....*(p n z )

在哪里

N is the given number
p is prime numbers smallest to greatest
a,b,..z are the power over the prime
* is the multiplication operation
4

3 回答 3

5

这称为因式分解。谷歌关键词:prime factorization algorithm

问题是,我们仍然无法真正快速地做到这一点。它为密码学(例如 RSA 算法)提供了很好的基础。

祝你好运!

于 2012-10-24T10:44:37.617 回答
1

整数分解的算法有很多:试除法、Pollard 的 rho 算法、椭圆曲线、二次筛等。谷歌搜索其中一些主题会有所帮助。为了让你开始,这里是一个通过试除法分解的算法:

function td_factors(n)
    f = 2
    while f * f <= n
        if n % f == 0
            output f
            n /= f
        else
            f = f + 1
    output n

为了进一步阅读,我谦虚地在我的博客上推荐这篇文章。

于 2012-10-24T12:49:28.973 回答
1

如果我们不关心时间优化,这不是一个那么复杂的问题!以下是有效的简单代码。

#include<iostream>
#include<vector>
#include<map>
#include<cmath>

using namespace std;

int get_primes(int max_number, vector<int> &primes)
{
    int *table = new int[max_number + 1];

    memset(table, -1, sizeof(int) * (max_number + 1));

    table[0] = table[1] = 0;

    primes.clear();

    for(int i = 2;i<=max_number ;i++)
    {
        if(table[i])
        {
            primes.push_back(i);
            for(int j = i * i;j<=max_number;j+=i)
            {
                table[j] = 0;
            }
        }
    }

    delete [] table;
    return primes.size();
}

int get_prime_factor(int number, map<int , int> &factors)
{
    vector<int> primes;
    get_primes(number,primes);

    factors.clear(); 
    int ret = 0;
    for(int i = 0;primes[i] <= number;)
    {
        if(number % primes[i] == 0)
        {
            ret ++;
            factors[primes[i]] ++;
            number /= primes[i];
        }
        else
            i++;
    } 
    return ret;
}

int main()
{
    cout<<"Please input a number:"<<endl;
    int number;

    cin>>number;

     map<int , int> factors;
     get_prime_factor(number,factors);


    for(map<int,int>::iterator itr= factors.begin();itr != factors.end();++itr)
    {
            cout<<"("<<itr->first<<"**"<<itr->second<<")";
    }

    cout<<endl;
    getchar();
    getchar();
    return 0;

}

希望能帮助到你!

于 2012-10-24T11:40:00.327 回答