这里讲一下算法中常用到的唯一因子分解定理:
合数a仅能以一种方式写成如下乘积形式:
a = p1^e1*p2^e2*...*pr^er
其中pi为素数,p1<p2<...<pr,且ei为正整数。例如数6000=2^4*3*5^3。
证明就不讲了,网上一抓一大把,这里应用这个定理写了一个类,可以在分解合数的时候增加效率。
#include <iostream>
#include <vector>
#include <cstring>
using namespace std;
#define maxn 65535
class Resolve
{
public:
bool list[maxn];
vector<long long> v;
Resolve()
{
find_Prime();
}
void find_Prime()
{
memset(list,true,sizeof(list));
for(long long i=2;i<=maxn;i++)
{
for(long long j=i*i;j<=maxn;j+=i)
{
list[j]=false;
}
}
for(long long i=2;i<=maxn;i++)
{
if(list[i])
v.push_back(i);
}
}
vector<long long> reso(long long x)
{
vector<long long>ans;
long long k=0;
while(x>1)
{
if(x%v[k]==0)
{
ans.push_back(v[k]);
x/=v[k];
continue;
}
k++;
}
return ans;
}
~Resolve()
{
vector<long long>().swap(v);
delete[] list;
}
};
最后再附上释放向量vector内存的方法。
//方法一
vector<int>v;
//释放语句
vector<int>().swap(v);
//方法二,动态创建对象时
vector<int> *v=new vector<int>();
//释放语句
delete[] v;