当前位置: 代码迷 >> 综合 >> 2017年第八届蓝桥杯-等差数列
  详细解决方案

2017年第八届蓝桥杯-等差数列

热度:24   发布时间:2024-02-28 05:56:29.0

解题步骤:

  1. 埃氏筛法生成素数列
  2. 枚举首项
  3. 枚举公差
  4. 检查是否够10个长度
    set s;
    *坑:set中的最后一个元素为(s.rbegin()),find(x)如果找到就返回在容器中的下标,否则就返回s.end()

代码:

#include <iostream>
#include <set>
#define N 5000
using namespace std;
typedef long long ll;
set<ll> s;
//埃氏筛法-生成素数列 
bool is_prime[N];	//辅助工具 void init(){
    for(ll i = 2;i <= N;i++){
    is_prime[i] = true;}
}void isPrime(){
    for(ll i = 2;i <= N;i++){
    if(is_prime[i]){
    s.insert(i);for(ll j = 2*i;j <= N;j+=i){
    {
    is_prime[j] = false;	//查看后面的是不是素数 }}}}
}int solve(){
    set<ll>::iterator it = s.begin();for(;it != s.end();it++){
    //枚举首项 int first = *it;	//首项 for(ll delta = 1;delta < (*s.rbegin()-first);delta++){
    //枚举公差,*s.rbegin()返回的是set中最后一个元素 int m = first;for(int len = 1;len<10;len++){
    //枚举长度m+=delta;	//首项加上公差 if((s.find(m))== s.end()){
    //如果找不到break; } if(len == 9) return delta;}} }return -1; 
}int main(){
    init();isPrime();cout << solve() << endl;return 0;
}

结果:
在这里插入图片描述
埃氏筛法链接