题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2136
题目大意
就是找出每个数字的所组成的最大的质因素因子,然后输出这个质因素因子在质数表里的位置。比如:6,6的最大的质因素因子为3,3在因素表里为第2位,故输出2.有个特殊的,就是1输出0.
思路
利用num[1000005]数组,从2到1000000的进行遍历,根据数组最开始都没赋值的来处理,比如最开始的是num[2]就将其赋值为1,然后再紧接着从2×2一直到1000000为止,每过2个就将其赋值为1(这个用变量记录了),结束后之前赋值的变量+1,然后到下一循环接着就赋值之前+1的变量了,也就是2,然后从3×2一直到1000000为止,每过3个数就将其赋值为1(就相当于是会覆盖掉部分之前2所填的数字位),,,然后一直循环下去,一直填到999999数字为止。
这样得到的数组的值就是代表着最大的质因素因子在质数表的位置了。
注意事项
①“int num[M];”不能放在int main里面,会导致程序直接崩溃掉
②接受数据那边的while循环里面不能用“while(cin>>number)”,会导致超时,还是老老实实地用“while(scanf("%d",&number) != EOF)”
③下面的代码中的
num[i] = k;
for(int j = i*2;j < N;j+=i){//注意是j+=i相当于在这素数所产生的数字的都赋予对应的素数位置的值
num[j] = k;
}
可换为
for(int j = i;j < N;j+=i){
num[j] = k;
}
ac代码:这个代码参考过右边这个博主https://blog.csdn.net/bear1998/article/details/52853256
#include<stdio.h>
#include<math.h>
#define M 1000005
#define N 1000000
int num[M];//记录这个数字的最大素数在素数表里的位置,如:4的最大素数为2,在素数表里为第一位
void init(){
int k = 1;//用来记录质数在质数表里的位置
for(int i = 2;i < N;i++){
if(!num[i]){//保证进入的是还没有填过的,也就是质数位
num[i] = k;
for(int j = i*2;j < N;j+=i){//注意是j+=i相当于在这素数所产生的数字的都赋予对应的素数位置的值
num[j] = k;
}
k++;//加1就是让这个素数位的值后移,如素数2的位数是第1位,之后的3就是第2位
}
}
}
int main(){
int number;
init();
while(scanf("%d",&number) != EOF){
printf("%d\n",num[number]);
}
return 0;
}