首先筛选出2到 ( 2 3 1 − 1 ) ‾ ‾ ‾ ‾ ‾ ‾ ‾ ‾ ‾ √ 的素数,然后对每个输入的数进行分解。最后若只有一个素因子,则得出的和要加1。输入为1时,输出为2。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
| #include<cstdio> #include<cstring> #include<cmath> typedef long long LL; using namespace std; const int maxn=46350; bool np[maxn]; int p[4800],prime; int e[4800]; void init(){ for(int i=2;i<maxn;++i){ if(!np[i]) p[prime++]=i; for(int j=0;j<prime&&i*p[j]<maxn;++j){ np[i*p[j]]=true; if(!(i%p[j])) break; } } return; } LL fexp(int a,int b){ LL cur=1,tmp=a; while(b){ if(b&1) cur=cur*tmp; tmp=tmp*tmp; b>>=1; } return cur; } int main(){ init(); int t=0; LL n; while(~scanf("%lld",&n)&&n){ if(n==1){ printf("Case %d: 2\n",++t); continue; } memset(e,0,sizeof(e)); int cnt=0; LL ans=0; for(int i=0;i<prime;++i){ while(n%p[i]==0) n/=p[i],++e[i]; if(e[i]>0) ++cnt,ans+=fexp(p[i],e[i]); if(n==1) break; } if(n!=1) ++cnt,ans+=n; if(cnt==1) ++ans; printf("Case %d: %lld\n",++t,ans); } return 0; }
|
** 本文迁移自我的CSDN博客,格式可能有所偏差。 **