蓝桥杯刷题——等差素数列(暴力搜索)

432 阅读2分钟

「这是我参与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;
}