题意很简单。主要说下思路:首先把100万以内的素数打出来,然后存到prime数组里,存的时候用另一个数组记录该素数是第几个素数。这题卡时间的地方主要在分解数的地方,把一个数分解为素数的积,只需要分解到该数的sqrt(n)处即可。注意这个地方就可以了。题目:
最大素因子
时间限制:
1000 ms | 内存限制:
65535 KB
难度:
2
-
描述
-
i c e最近正在学习数论中的素数,但是现在他遇到了一个难题:给定一个整数n,要求我们求出n的最大素因子的序数,例如:2的序数是1,3的序数是2,5的序数是3,以此类推. 研究数论是需要很大的耐心的,为了惩罚那些没有耐心读完题目的童鞋,我们规定:1的最大素因子序数是0.
-
输入
- 有多组测试数据,每一行输入一个数字n.(0<n<=1000000) 输出
- 在接下来的一行,输出结果. 样例输入
-
1 2 3 4 5
样例输出
-
0 1 2 1 3
#include <iostream>
#include <string.h>
#include <cstdio>
#include <cmath>
using namespace std;
const int mmax=1000005;
int k=0,prime[500005],num[mmax];
bool flag[mmax];
void init(){
memset(flag,0,sizeof(flag));
memset(num,0,sizeof(num));
for(int i=2;i<=(int)sqrt(mmax*1.0);++i){
if(!flag[i]){
for(int j=i*i;j<mmax;j+=i){
flag[j]=1;
}
}
}
k=0;
for(int i=2;i<mmax;++i){
if(!flag[i]){
prime[k]=i;
num[i]=k;
k++;
}
}
}
int fenjie(int n){
int i;
for(i=0;prime[i]<=(int)sqrt(n*1.0);++i){
if(n==1)break;
if(n%prime[i]==0){
while(n%prime[i]==0){
n/=prime[i];
}
}
}
if(n==1)
return prime[i-1];
else return n;
}
int main(){
init();
int n;
while(~scanf("%d",&n)){
if(n==1){puts("0");}
else{
int x=fenjie(n);
printf("%d\n",num[x]+1);
}
}
return 0;
}