2,3,5,7,11,13,....是素数序列。
类似:7,37,67,97,127,157 这样完全由素数组成的等差数列,叫等差素数数列。
上边的数列公差为30,长度为6。
2004年,格林与华人陶哲轩合作证明了:存在任意长度的素数等差数列。
这是数论领域一项惊人的成果!
有这一理论为基础,请你借助手中的计算机,满怀信心地搜索:
长度为10的等差素数列,其公差最小值是多少?
注意:需要提交的是一个整数,不要填写任何多余的内容和说明文字。
数论定理:
长度为k的素数等差数列,它的公差d能被小于k的所有素数整除
由上可知,长度为k的素数等差数列的最小公差为小于k的所有素数之积
10以内的素数为2,3,5,7
因此公差最小值为210
wtf、这是数学题吧?
附上代码:
#include <iostream>
using namespace std;
int findmin(int a[]) //找到 最小的公差数并且返回输出
{
int num=0;
for(int g=1;g<40000;g++) //一层循环控制公差数
{
for(int j=2;j<40000;j++) //二层循环控制所有的 数
{
if(a[j]==0&&j+10*g<40000) //分支条件为该数为素数 并且最大的数不超过 40000
{
for(num=1;num<10;num++) //这个数列的前十位
{
if(a[j+num*g]==1) break; //如果这个数 不是素数,则跳出循环
}
}
if(num==9) return g; //如果循环 结束 num=9 则证明 能找到该数的10个等差数列 并且当前的公差数为最小的公差数
}
}
}
int main()
{
int a[40000]={0};
int num=0;
for(int i=2;i<40000;i++) //找到40000以内的所有的素数 并且标记 是素数则 标记为0 不是则标记为1
{
if(a[i]==0)
{
for(int j=2;i*j<40000;j++)
{
a[i*j]=1;
}
}
}
cout<<findmin(a);
return 0;
}
原博地址
https://blog.csdn.net/weixin_43673589