笃定,专注,少言。。。
不要懊悔,不要嫉妒,不要焦虑,既然笃定了自己的目标和大致规划,就要全身心的投入,不要被周围环境所影响,该是你的跑不掉。。。
上次练习的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;
}