天天看点

蓝桥杯第八届省赛 素数等差数列

2,3,5,7,11,13,....是素数序列。

类似:7,37,67,97,127,157 这样完全由素数组成的等差数列,叫等差素数数列。

上边的数列公差为30,长度为6。

2004年,格林与华人陶哲轩合作证明了:存在任意长度的素数等差数列。

这是数论领域一项惊人的成果!

有这一理论为基础,请你借助手中的计算机,满怀信心地搜索:

长度为10的等差素数列,其公差最小值是多少?

注意:需要提交的是一个整数,不要填写任何多余的内容和说明文字。

代码如下

#include <stdio.h>
#include <string.h>



int shu(int num)//确定是否为素数
{   int    i=2;
   for(; i<num; i++)
   {
      if(num %i ==0)
            break;
   }
   if(i == num)
          return 1;
   return 0;
}


int main()
{
   int num = 2;
   int gain;
   for(int i = num; i < 1000 ; i++)
   {
      if(shu(i))
      {
      	for(int gkd = 1;gkd <1000; gkd++)
      	{
         if(shu(i) && shu(i+gkd*2) &&shu(i+gkd*3) &&shu(i+gkd*4) &&shu(i+gkd*5) &&shu(i+gkd*6) &&shu(i+gkd*7) &&shu(i+gkd*8) &&shu(i+gkd*9))//暴力破解法
       	  {
       	  gain = gkd;   
          }
      
      	}
      }
   }
   printf("%d",gain); 
}
           

 开始的时候被素数迷惑,认为数列应该以第一个质数为第一个元素,然后以第二个素数为数列的第二个元素,再以两个素数间的差值为公差判断,第二个素数加上公差的第三个值是否为素数,否则将第二等差数列的值设为第三个素数,再重复上面的过程。

 但是如果等差数列本身就没有第一个素数就会陷入死循环。

 所以使用了蛮力法,因为本题只要求10位等差素数数列,所以只判断素数的范围是从1到1000,先判断当前值是否为素数,如果不是跳过,计算下一位数字,如果是,在把公差从1加到1000,把当前素数加上公差的九个数判断是否都为素数,如果是输出,公差,否则跳过当前数,判断下一位数,重复上面的过程。

 以上是我的想法,如果有哪位大佬能够指出错误,或者提出更优的算法,十分感激。

继续阅读