唯一分解定律的应用,任何数都能分解成几个质数相乘的形式,那个质数部分说明了这个质数出现的次数。所以用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; }
原文地址:http://blog.csdn.net/weizhuwyzc000/article/details/44515485