输入整数n(1<=n<2^31),求至少两个整数,使得它们的最小公倍数为n,且这些整数的和最小。输出最小的和。
分析:运用唯一分解定理,设唯一分解式n=a1^p1*a2^p2…,当每个ai^pi作为一个单独整数时候最优。
注意一些特殊情况,n=1时答案为1+1=2,因为题目要求至少两个数;n只有一种因子时候同理需要加1。而且注意n=2^31-1不要溢出。
代码如下:
#include <cstdio>
#include <cmath>
using namespace std;
int n,x;
int main(){
int kase = 0;
while (scanf("%d",&n) && n){
if (n==1) {printf("Case %d: 2\n",++kase); continue;}
long long sum = 0;
int t=0;
int m = (int)sqrt((double)n + 5);
for (int i=2; i<=m; i++) {
if (n%i) continue;
t++; //记录有多少个素数因子
x = 1;
while (n%i==0) {x*=i; n/=i;}
sum += x;
}
if (t==1 || n!=1) sum += n;
if (t==0) sum++;
printf("Case %d: %lld\n",++kase,sum);
}
return 0;
}