【蓝桥杯】2017年第八届蓝桥杯C/C++B组省赛——B题 等差素数列

题目

标题:等差素数列算法

2,3,5,7,11,13,....是素数序列。
相似:7,37,67,97,127,157 这样彻底由素数组成的等差数列,叫等差素数数列。
上边的数列公差为30,长度为6。数组

2004年,格林与华人陶哲轩合做证实了:存在任意长度的素数等差数列。
这是数论领域一项惊人的成果!函数

有这一理论为基础,请你借助手中的计算机,满怀信心地搜索:spa

长度为10的等差素数列,其公差最小值是多少?3d

注意:须要提交的是一个整数,不要填写任何多余的内容和说明文字。code

题解

絮絮不休(骂骂咧咧blog

一开始看到这道题仍是有点懵的,毕竟我个数学小白,对素数什么的最发怵了。数学

而后找了好多大佬的题解都没看明白,甚至有一个大佬的代码看的我晕头转向~string

而后终于被我找到一份能看懂而且以为很是正确的代码,思路以下:it

思路

两层循环,一层循环用于循环公差,一层循环用于循环起始素数。

须要注意的是,内层循环起始素数的时候,不能无边界循环下去,要设置一个上限,不然外层循环永远没法走到下一个公差(本身写的时候自觉得是犯的错

内层循环走的时候,只须要判断:
①这个数是否是素数(做为起始素数最基本的条件)
②判断从这个素数开始,以cha为公差可否存在连续10个等差的素数。【用ok函数来判断的】

若是以上两个条件都知足,则这就是咱们要找的长度为10的等差素数列,其公差的最小值

由于咱们是从小到大找的,那咱们找到的知足条件的第一个就是答案~

代码

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std;
typedef long long ll;
const ll maxn=1e6+50;
ll a[maxn];
bool ok(ll n,ll cha)
{
	for(ll i=0;i<10;i++)
	{
		if(!a[n+i*cha])return 0;
	}
	return 1;
}

int main()
{
	a[1]=0;
	a[2]=1;
	a[3]=1;
	for(ll i=4;i<=1000000;i++)
	{
		bool flag=0;
		for(ll j=2;j*j<=i;j++)
		{
			if(i%j==0)
			{
				flag=1;
				break;
			}
		}
		if(flag)a[i]=0;
		else a[i]=1;
	}
	
	for(ll cha=1;;cha++)
	{
		for(ll i=2;i<1000000;i++)
		{
			if(a[i]&&ok(i,cha))
			{
				printf("%lld\n",cha);
				return 0;
			}
		}
	}
}

后记

其实我对素数一直都怀有敬畏之心,但愿能找个时间把素数的相关算法摸摸透,把板子整理齐全~(先给本身挖个坑

要是整理好了,我就把连接更新上来!(咕咕咕~

相关文章
相关标签/搜索