「这是我参与2022首次更文挑战的第18天,活动详情查看:2022首次更文挑战」。
这也是蓝桥杯常出的一类题目,大多都可以用暴力搜索来完成,但暴力搜索的前提是搜索过程不出错,代码设计要足够严谨,不要遗漏一些特殊情况。
题目
数论中已经证明:存在任意长度的素数等差数列。要求找出长度为10的素等差数列,也就是这里的等差数列中的所有数要全部是素数,并且要求求出这些素数的最小公差是多少。例如7,37,67,97,127,157就是个公差为30,长度为6的等差素数列。
思路
我们先找到第一个数,也就是素数2,从这个数开始,将它的公差从1到10000开始遍历,每次选定公差后,往后判断10个数,判断是否都为素数,如果判断过程中出现了非素数,就退出,下一个公差开始判断。如果所有公差都试过了,都不行,那么找别的第一个数,从2开始,不行就寻找后一个数,当然第一个数一定要是素数。假设每个数都遍历10000个公差,并且都遍历十个数,再假设第一个数最多到10000,总共计算量就是10万乘以1万,10亿次计算加上判断是否是素数的时间,应该勉强不超时,但是一万以内素数没有那么多,应该是超不了时的。如果10000以内还没有答案,那可以将第一个数从10000再开始,反正蓝桥杯不是acm,错一次加时长。判断非素数后一定要及时退出,减少运算量。这样代码应该就没有漏洞了,答案也就出来了。
代码
#include<bits/stdc++.h>
using namespace std;
bool judge(int n) //判断素数
{
int k;
k=(int)sqrt((double)n);//通过开平方去判断,减少判断时间
for(int i=2;i<=k;i++){
if(n%i==0){
return 0;
}
}
return 1;
}
int main()
{ int i,j,sum,m;
for(i=2;i<=10000;i++){
if(!judge(i))
continue;
for(j=1;j<=10000;j++){ //j为公差
sum=1;
m=i;
while(1){
m+=j;
if(judge(m)){
sum++;
if(sum>=10){
cout<<j<<endl;
return 0;
}
}else
break;
}
}
}
return 0;
}