您的位置:首页 > 其它

第八届蓝桥杯真题 02 等差素数列

2017-04-14 21:40 267 查看
题目:

标题:等差素数列

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

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

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

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

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

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

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

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

答案:210

解题思路:先将50000以内的素数用打表的方法将素数判断出来,再通过for循环逐个查找符合题意的素数。

代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int a[50000];
void sushu()
{
memset(a,1,sizeof(a));
int i,j;
a[0]=0;
a[1]=0;
for(i=2; i<50000; i++)
{
if(a[i])
{
for(j=i+i; j<50000; j+=i)
{
a[j]=0;
}
}
}
}
int main()
{
int flag=0;         //标记是否找到最小的一个符合条件的数列
int i,j,k;
int x,c;            //x 用作存放下一个符合条件的素数,c 用来保存已找到的符合条件的素数数目
sushu();
for(i=2; i<5000; i++) //数列第一项为i
{
if(!a[i])
continue;
else
{
for(j=1; j<500; j++) //数列公差为j
{
x=i;
c=1;
while(1)
{
x=x+j;
if(a[x])
{
c++;
if(c>=10)
{
printf("公差=%d\n",j);   //输出找的符合题意的公差
for(k=i; k<i+10*j; k+=j)  //输出找到符合题意的数列
{
printf("%d\t",k);
}
flag=1;             //表示已找到符合题意的数列
break;
}

}
else
break;
}
if(flag)
break;
}
}
if(flag)
break;
}
printf("\n");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  蓝桥杯真题