前言
蓝桥杯B组2017年省赛填空题(C++)
一、题目描述
2,3,5,7,11,13,… 是素数序列。 类似:
7,37,67,97,127,1577,37,67,97,127,157 这样完全由素数组成的等差数列,叫等差素数数列。
上边的数列公差为 30,长度为 6。
2004 年,格林与华人陶哲轩合作证明了:存在任意长度的素数等差数列。 这是数论领域一项惊人的成果!
有这一理论为基础,请你借助手中的计算机,满怀信心地搜索:
长度为 10 的等差素数列,其公差最小值是多少?
运行限制
- 最大运行时间:1s
- 最大运行内存: 128M
二、思路
这道题通过题面可以看出,不借助编程工具的话求解是比较困难的。我这里想到的是,既然为填空题,那么可以尝试用程序的暴力求解,通过n次的尝试最终获得一个最小值,那么n次的尝试可以通过程序对于某一过程反复运行,最终得出一个正确的最小值。程序的结构为,设定一个变量temp,为公差,然后通过外层循环,不断的增加temp的值,内层循环,设置一个起始值start,为等差序列的起始值,依次累加这个公差temp,出现不为素数的项,即不符合要求,跳过。这里内层尝试的次数上限为997,即初始项的值最大为997。
最终答案为210,初始项为199。
三、程序代码
#include<bits/stdc++.h>
using namespace std;
int judge(int n)
{
if(n==2)
{
return 1;
}
for(int i=2;i<n-1;i++)
{
if(n%i==0)
{
return 0;
}
}
return 1;
}
int main()
{
int temp=10;
while(1)
{
int start=7;
int count=997;
while(count--)
{
int flag=0;
int start3=start;
if(judge(start3)==0) //起始值不为素数,直接跳过
{
start++;
continue;
}
for(int i=0;i<10;i++) //10次等差循环
{
if(judge(start3)==0) //等差队列的某一项不为素数,不符合要求,跳过
{
flag=1;
break;
}
start3+=temp; //公差
}
if(flag==0) //如果遍历结束,每一项都是素数且符合公差,即为正确结果
{
cout<<start<<" "<<temp<<endl;
return 0;
}
start++;
}
temp++;
}
return 0;
}