hdu2136(筛素数,遍历预处理)

题目链接: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;

} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值