查找质因数(埃氏筛打表,判断因子)

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

猜你喜欢

转载自blog.csdn.net/zhaobaole2018/article/details/84717501