這裏講一下算法中常用到的唯一因子分解定理:
合數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;