题目描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
2,3,5,7,11,13,....2,3,5,7,11,13,.... 是素数序列。
类似:7,37,67,97,127,1577,37,67,97,127,157 这样完全由素数组成
的等差数列,叫等差素数数列。
上边的数列公差为 30,长度为 6。
2004 年,格林与华人陶哲轩合作证明了:存在任意长度的素数等差数列。 这是数论领域一项惊人的成果!
有这一理论为基础,请你借助手中的计算机,满怀信心地搜索:
长度为 10 的等差素数列,其公差最小值是多少?
运行限制
最大运行时间:1s
最大运行内存: 128M
本题思路较为清晰:首先我们尽可能将所有的素数都先找出来(填入一个数组),其次,我们依次枚举首项、枚举公差、枚举个数(判断长度),直到找到我们的答案(公差)!!!!!!!!!
上述思路是我在审题后所想到的第一个思路,因为这题是填空题,我们只需得到答案即可,无需考虑我们所写代码的运行效率等问题,如果读者有更好的思路(更高的效率),欢迎读者评论!!!
下面给出我写的代码
int prime(int i)
{
int j;
if(i<=1)
return 0;
else
{
for(j=2;j<i/2+1;j++)
{
if(i%j==0)
return 0;
}
return 1;
}
}
#include<stdio.h>
int main()
{
typedef long long LL;
const int n=5000;
int index=0,i=0,a,b,c;
LL pr[n];
// 将素数填入数组
while(index<n)
{
if(prime(i))
{
pr[index]=i;
index++;
}
i++;
}
// 枚举首项
for(a=0;a<n;++a)
{
LL first=pr[a];
// 枚举公差
for(b=2;b<pr[n-1]-first;b++)
{
// 枚举个数
LL f=first;
for(c=1;c<10;c++)
{
f+=b;
if(!prime(f))
{
break;
}
if(f>pr[n-1])break;
if(c==9)
printf("%d",b);
}
}
}
return 0;
}