唯一分解定律的应用,任何数都能分解成几个质数相乘的形式,那个质数部分说明了这个质数出现的次数。所以用while()循环来求得各个质数。用k来得出每个小部分。注意到有可能这个数会被一个小质数给除尽,例如n=4,则答案要+1=5
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int ans = 100000;
int vis[ans+5];
vector<int> primes;
void add_primes() {
int m=sqrt(ans+0.5);
memset(vis,0,sizeof(vis));
for(int i=2;i<=m;++i) if(!vis[i])
for(int j=i*i;j<=ans;j+=i)
vis[j] = 1;
for(int i=2;i<=ans;i++)
if(!vis[i]) primes.push_back(i);
}
void solve(LL n,LL& maxn) {
long long bns=n;
int k,bbs=0;
for(int i=0;primes[i]<sqrt(bns+0.5);++i){
k=1;
while(n%primes[i]==0) {
n/=primes[i];
k*=primes[i];
}
if(k!=1) {
maxn+=k; bbs++;
}
if(n==1) break;
}
if(n!=1&&n!=bns) maxn+=n;
if(n==bns) { maxn=bns+1;return ; }
if(bbs==1&&n==1) maxn++;
}
int main() {
int kase=0;
add_primes();
LL n;
while(scanf("%lld",&n)!=EOF&&n) {
LL maxn=0;
solve(n,maxn);
printf("Case %d: %lld\n",++kase,maxn);
}
return 0;
}