声明:最近有点小烦躁,学了这么长时间的算法,连个皮毛都不知道掌握了没有,漫无目的的学习,让我自己开始怀疑自己在学习过程中是否走入了低效的陷阱,学以致用,我准备这阵子认真准备20年的蓝桥杯,拿不拿奖无所谓,主要是以赛带动高效学习,嗯。。。就以2017年的真题开始吧!
啧啧啧,这B组第一题是什么鬼??不想做。。。B组第二题,嗯。。。可以可以,那就从这里开始吧:
题目:
2,3,5,7,11,13,…是素数序列。类似:7,37,67,97,127,157 这样完全由素数组成的等差数列,叫等差素数数列。上边的数列公差为30,长度为6。2004年,格林与华人陶哲轩合作证明了:存在任意长度的素数等差数列。这是数论领域一项惊人的成果!有这一理论为基础,请你借助手中的计算机,满怀信心地搜索:长度为10的等差素数列,其公差最小值是多少?
注意:需要提交的是一个整数,不要填写任何多余的内容和说明文字。
分析:
这题我自己做的时候虽然没有完全做对,但和最终结果也比较接近了,卡住我思路的关键是数学。。。
我没有想到用数组来表标记素数;对等差数列的表示,理解也不深刻。。。
公差为30,长度为6。这句话能不能真正理解是解决本题的关键,只有挖掘出了a+i*d,i++
才能很好的解决这题。
其实也就是一个高一学的的等差公式。。水平太次了,第二题就JJ了,好好积累吧。。。
//#include<bits/stdc++.h>
#include<iostream>
#include<cmath>
#define N 100000
using namespace std;
int a[N];
bool isprime(int x){
if(x<2){
return false;
}
for(int i=2;i<sqrt(x);i++){
if(x%i==0){
return false;
}
}
return true;
}
int main(){
int i,len,d;
for(int i=2;i<N;i++){
if(isprime(i)){
a[i]=1;
}
}
for(d=1;d<N;d++){
for(i=2;i<N;i++){
for(len=0;len<10;len++){
if(a[i+d*len]!=1){
break;
}
}
if(len==10){
cout<<d;
return 0;
}
}
}
return 0;
}