唯一分解定理又叫算术基本定理:任意一个合数(非素数),都能写成任意素数幂的乘积形式。
定理应用:(来源,百度百科)
模板代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5;
bool is[maxn];
int cnt =0;
ll spr[maxn],zs[maxn],ds[maxn];
void olp(){ //先打表,欧拉筛
memset(is,true,sizeof is);
is[0] = is[1] = 0;
for(int i=2;i<maxn;i++){
if(is[i]) spr[cnt++]= i;
for(int j=0;i*spr[j]<maxn&&j<cnt;j++){
is[i*spr[j]] = 0;
if(i%spr[j]==0) break;
}
}
}
int fj(ll x){ //不同素数的个数
int k=0,loop=0;
for(int i=0;i<cnt;i++){
while(x%spr[i]==0){
if(loop==0){
loop=1;
k++;
}
x/=spr[i];
ds[k]=spr[i];//底数
zs[k]++; //指数
}
if(x==1) break;
loop=0;
}
if(x!=1){ //如果分解玩x都不等于1,那么x必定是一个素数
k++;
ds[k] = x;
zs[k] = 1;
}
return k;
}
int main(){
olp();
ll x;cin>>x;
int k=fj(x);
for(int i=1;i<=k;i++){
printf("%d^%d%c",ds[i],zs[i],i==k?'\n':'+');
}
return 0;
}
测试样例:
1000
2^3*5^3