[蓝桥杯B组C++/C]第二题:等差素数列

来源:互联网 发布:数据库新建表 编辑:程序博客网 时间:2024/06/06 17:40
标题:等差素数列 2,3,5,7,11,13,....是素数序列。 类似:7,37,67,97,127,157 这样完全由素数组成的等差数列,叫等差素数数列。 上边的数列公差为30,长度为6。 2004年,格林与华人陶哲轩合作证明了:存在任意长度的素数等差数列。 这是数论领域一项惊人的成果! 有这一理论为基础,请你借助手中的计算机,满怀信心地搜索: 长度为10的等差素数列,其公差最小值是多少? 注意:需要提交的是一个整数,不要填写任何多余的内容和说明文字。

解题思路:

用筛法求素数,not_prime[i]数组标记了第i个数是不是素数

从第一个素数2,长度为1开始穷举:

起始素数2,长度1...2...3....

起始素数3,长度1...2...3....

起始素数5,长度1...2...3....

...

起始素数i,长度1...2...3....

如果满足10个等差素数,就输出公差d,结束穷举

#include <iostream>#include <cstring>using namespace std;const int maxn = 10000;bool not_prime[maxn];void f(){memset(not_prime,0,sizeof(not_prime));not_prime[0] = not_prime[1] = 1;for (int i = 2; i < maxn; ++i){if (!not_prime[i]){for (int j = i * 2; j < maxn; j += i){not_prime[j] = 1;}}}}int main(){f();//for (int i= 2; i < 100; ++i) if (!not_prime[i]) cout << i << " ";int find = 0;for (int i = 2;!find && i < maxn; ++i){//从2开始作为开头for (int d = 1; &find && d < 1000; ++d){int len = 0;int temp = i;while (!not_prime[temp]){++len;temp = temp + d;if (len == 10){cout << "d:" << d<<endl;find = 1;break;}}} }return 0; }