题目:
标题:等差素数列
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;
}