题目:输入整数n,求至少两个正整数,使它们的最小公倍数为n,且这些整数的和最小。输出最小的和。
分析:唯一分解定理。特殊情况时注意特殊处理。
#include<cstdio>
#include<cmath>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<vector>
#include<sstream>
#include<map>
#include<stack>
#include<queue>
using namespace std;
long long n;
int vis[1000001],ans,kase = 0;
bool Isprime(long long num){
for(long long i = 2;i<sqrt(num);i++) if(num%i==0) return false;
return true;
}
int main(){
memset(vis, 0, sizeof(vis));
long long m = sqrt(1000001+0.5);
vis[1] = 1;
for(int i = 2;i<=m;i++) if(!vis[i])
for(int j = i*i;j<=1000000;j+=i) vis[j] = 1;//筛法造质数表
while(cin>>n&&n){
kase++;
printf("Case %d: ",kase);
ans = 0;
int t = 2,p,yes = -1;
if(n==1){cout<<2<<endl;continue;}
if(n==2){cout<<3<<endl;continue;}
if(Isprime(n)){cout<<n+1<<endl;continue;} //如果为质数,着特殊处理
while(n!=1){//唯一分解定理
while(vis[t]==1||n%t!=0) t++;
p = 1;yes++;
while(n%t==0){
n/=t;
p*=t;
}
ans+=p;
t++;
}
if(yes) cout<<ans<<endl;
else cout<<ans+1<<endl;
}
return 0;
}