题目
题意 给定一个数求出能构成它的质因数的和的最小值。
思路 将它分解质因数 加起来就是最小值
特殊情况需要判断的是比如8 9这些除了1 只有一个公因数的 答案要加上1。
思路就是先把所有数据范围开根号内的素数预处理出来,再判断他是不是质数,如果是质数直接printf它本身+1,如果不是就分解质因数求和。
#include<iostream>
#include<cmath>
using namespace std;
int s[1010];
bool prime(long long n)
{
for(int i=2;i<=n/i;i++)
if(n%i==0) return 0;
return 1;
}
long long fenjie(long long n)
{
long long ans=0;
long long t=n;
int cnt=0;
for(int i=2;i<=t/i+1;i++)
{
int temp=1;
if(n%i==0)
{
cnt++;
while(n%i==0)
{
n/=i;
temp*=i;
}
ans+=temp;
if(prime(n)&&n!=1)
{
ans+=n;
return ans;
}
}
}
if(cnt>1)
return ans;
else
return ans+1;
}
int main()
{
int k=0;
long long n;
while(scanf("%lld",&n)!=EOF)
{
++k;
if(n==0) break;
if(prime(n)) printf("Case %d: %lld\n",k,n+1);
else if(n!=1) printf("Case %d: %lld\n",k,fenjie(n));
else printf("Case %d: 2\n",k);
}
return 0;}