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,把当前素数加上公差的九个数判断是否都为素数,如果是输出,公差,否则跳过当前数,判断下一位数,重复上面的过程。
以上是我的想法,如果有哪位大佬能够指出错误,或者提出更优的算法,十分感激。