JXUFE紫書第三章例題 Prime Factors
阿新 • • 發佈:2019-01-12
int ms =(int)sqrt(2^31-1)+1;
cin>>x;//x 是輸入的數
0.打表
1.不用儲存大於 ms 的素數,後期繞暈了。 記得篩選素數的時候到i*i<=x就行了。
2.不能直接判斷x是不是在isprime裡面,否則會造成RE,因為isprime[x>ms]會造成陣列越界。
3.有時候直接判斷特殊情況可以減少工作量,但會犧牲程式碼簡潔性(便於查錯)。
4.細節處理
……
#include<bits/stdc++.h> using namespace std; #define MAXN 47000 int su[MAXN]; bool isprime[MAXN]; int cnt=1; //獲得素數 void getp() { int i,j; isprime[0]=isprime[1]=0; for(i=2;i<MAXN;i++) { if(isprime[i]) su[cnt++]=i; for(j=1;j<cnt&&su[j]*i<MAXN;j++) { isprime[su[j]*i]=0; } } } int main() { int i; for(i=0;i<MAXN;i++) { isprime[i]=1; } getp(); int x; //當有輸入並且輸入不為0時 while(~scanf("%d",&x)&&x) { int first=1; printf("%d =",x); //x是負數就先輸出-1,並取反,置first=0 if(x<0) { x=-x; printf(" -1",x); first=0; } //如果有的除,就一直除;如果除到1,分解完畢 for(i=1;i<cnt;) { if(x==1) break; if(x%su[i]==0) { if(first) { first=0; printf(" %d",su[i]); } else printf(" x %d",su[i]); x/=su[i]; } else { i++; } } //如果經過前面的還沒被除到一,說明這是一個很大的素數(大於2^31-1的平方根) if(x!=1) { if(first) printf(" %d",x); else printf(" x %d",x); } cout<<endl; } return 0; }