查詢質因數(埃氏篩打表,判斷因子)
阿新 • • 發佈:2018-12-07
#include<cstdio> #include<iostream> #include<string.h> #include<algorithm> using namespace std; const int maxn=1e6; ///範圍 int tot; ///質數陣列下標,數著質數個數 int pri[maxn]; ///質數陣列 int fac[maxn]; ///質因數陣列 bool is[maxn]; ///定義一個bool型別陣列,存放範圍內的數,後來全初始化為1 ///該範圍內素(質)數打表 void init(long long n) { tot=0; memset(is,1,sizeof(is)); ///bool型別陣列全部初始化為1(預設全為質數) is[0]=is[1]=0; ///0、1不是質數,單列 for(int i=2; i<=n; ++i) ///遍歷陣列 { if(is[i]) ///若範圍陣列中此數未被標為0,則其未被前面質數篩掉,屬於質數,用它去篩後面的數 { pri[++tot]=i; ///(1)將此數存於質數陣列 pri[0]裡沒存數字 for(int j=i+i; j<=n; j+=i) ///(2)從其2倍開始篩 { is[j]=0; } } } } int get_primefactors(int n) ///找n的質因數 { int sum=0; ///sum為質因數陣列下標,數著質因數個數 for(int i=1; i<=tot&&pri[i]*pri[i]<=n; ++i) ///遍歷 質數陣列 尋找其中的n的因數 { ///迴圈終止條件(1)質數陣列遍歷完全i=1;1<=tot.(2)即將測試的質數<=sqrt(n) if(n%pri[i]==0) ///如果測試的質數是n的因數 { fac[sum++]=pri[i]; ///記錄 while(n%pri[i]==0) ///只要pri[i]還是n的質因數,那就使n除以它一次 { n/=pri[i]; /// } } } if(n!=1) { fac[sum++]=n; ///最後一個數非1即質因數 } return sum; ///返回質因數的個數,而且質因數已被存於fac[sum]中 } int main() { // for(int i=0;i<10;i++) // { // cout<<pri[i]<<endl; // } long long n; while(scanf("%lld",&n)!=EOF) { init(n); int sum=get_primefactors(n); // for(int i=0; i<sum; i++) // { // cout<<fac[i]<<endl; // } sort(fac,fac+sum); for(int i=0;i<1e6;i++) { if(fac[sum-1]==pri[i]) { cout<<i<<endl; break; } } } return 0; }