算法竞赛---day2(等差素数列)

笃定,专注,少言。。。
不要懊悔,不要嫉妒,不要焦虑,既然笃定了自己的目标和大致规划,就要全身心的投入,不要被周围环境所影响,该是你的跑不掉。。。
上次练习的17年的B组第二题,这几天我在论坛还看到另一种求素数的方法,那个博主还是牛逼的,他分析了传统求素数的弊端即对于大范围单个判素数,耗时太大,然后提出用素数筛来暴力打表会省时很多,他还提出了优化的素数筛,反正我也不太懂,只知道他这种做法大致就是先把范围内的合数做标记,剩下的就都是素数,因为素数的倍数都是合数,所以在设计程序时,剔除合数就有了思路。具体为啥,我也是迷迷糊糊,可能一次性标记完了,比一个一个标记要快很多,反正以后判断素数,首选素数筛就完事了呗,其实对于蓝桥杯这题影响不是很大,因为这是一个填空题,而且数据还小,就当拓展学习了,其他的思路还是和原来一样,我把代码放下面(代码注释里面有我编码时的一些想法)供参考:

//#include<bits/stdc++.h> 
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int prime[10010],p[10010],len=0;
void isprime(){
	memset(p,0,sizeof(p));//`fill(p,p+N,1);`也是用来初始化数组的一种方式。
	p[0]=p[1]=1;//素数标记为0 合数数标记为1 0,1标记为1 因为是素数筛
	for(int i=2;i<10000;i++){
		if(p[i]){
			continue;//寻找素数 
		}
		for(int j=i;j*i<10000;j++){
			p[i*j]=1;//素数的倍数都是合数 j从i开始是为了避免重复 j*i而不是j是为了减少判断 
		} 
		prime[len++]=i;//将素数存入素数数组 
	} 
}
int main(){
	isprime();//素数筛 
	for(int i=0;i<len;i++){
		printf("%d ",prime[i]);//打印筛选出的素数 
	}
	cout<<endl; 
	for(int i=0;i<len;i++){//len个素数 
		int x=prime[i];
		for(int d=1;d<1000;d++){
			int j;
			for(j=1;j<10;j++){
				if(p[x+d*j]){//等差数列通项公式:首项(素数)+公差*项数。 
					break;
				}
			}
			if(j==10){
				printf("%d %d",d,x);
				return 0;//这里很关键! 
			}
		}
	} 
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值