1. 程式人生 > >查詢質因數(埃氏篩打表,判斷因子)

查詢質因數(埃氏篩打表,判斷因子)

#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;
}