1: 质因子分解
思路:由于质因子分解是唯一的(算术基本定理),因此只需要枚举质因子(提前打表质数),计数即可。
AC code:
#include<bits/stdc++.h>
using namespace std;
const int maxn=100000;
struct fac{
int x,cnt;
};
int p[maxn],num=0;//
bool vis[maxn];
void prime(){//素数打表
for(int i=2;i<maxn;i++){
if(!vis[i]){
p[num++]=i;
for(int j=i+i;j<maxn;j+=i){
vis[j]=true;
}
}
}
}
int main(){
int n;
cin>>n;
prime();
vector<fac>v;
int temp=n;
printf("%d=",n);
if(n==1) cout<<"1\n";
else{
for(int i=0;i<num && p[i]<=sqrt(1.0*temp);i++){
int cnt=0;
while(n%p[i]==0){
cnt++;
n/=p[i];
}
if(cnt>0) v.push_back({p[i],cnt}) ;
}
if(n>1) v.push_back({n,1});
for(int i=0;i<v.size();i++){
cout<<v[i].x;
if(v[i].cnt>1) cout<<"^"<<v[i].cnt;
printf("%s",i==v.size()-1? "\n":"*");
}
}
return 0;
}
2:连续因子分解
思路:若是素数,直接处理输出;否则开始枚举当前因子(从2开始),用cnt记录局部连续因子个数并用firstfac记录局部首因子,maxnum记录全局连续因子个数,遇到更长连续因子时进行相关变量刷新。
AC code:
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,temp;
cin>>n;
int firstfac=2,maxnum=0;
for(int i=2;i<=sqrt(1.0*n);i++){
temp=n;
int j=i,cnt=0;
while(temp%j==0){//枚举连续因子个数
temp/=j++;
cnt++;
}
if(cnt>maxnum){
maxnum=cnt;
firstfac=i;
}
}
if(maxnum){
cout<<maxnum<<endl;
for(int i=0;i<maxnum;i++)
printf("%d%s",firstfac+i,i==maxnum-1? "\n":"*");
}else cout<<"1\n"<<n;
return 0;
}
3:因子幂次方的组合:(※※※)
1103 Integer Factorization (30 分)
End !