#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;
}
查找质因数(埃氏筛打表,判断因子)
最新推荐文章于 2021-12-16 21:50:27 发布