我正在寻找一种能帮我分割数字 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
答案 0 :(得分:5)
它被称为分解。谷歌的关键词:prime factorization algorithm
。
问题是,我们仍然无法快速做到这一点。它为密码学提供了很好的基础(例如RSA算法)。
祝你好运!答案 1 :(得分: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;
}
希望它有所帮助!
答案 2 :(得分: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
为了进一步阅读,我在我的博客上谦虚地推荐essay。