zoukankan      html  css  js  c++  java
  • 第八届蓝桥杯省赛第二题---等差素数列

    标题:等差素数列

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

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

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

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

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

    分析:这道题目思路挺简单的,就是用线性筛选法把10^6内的素数筛选出来,然后从大到小枚举然后去验证

    关键是一定要掌握线性筛选法。。。

     1 #include<iostream>
     2 #include<cstdio>
     3 using namespace std;
     4 #define ll long long
     5 const int maxn=1e6;
     6 int check[maxn]={0};
     7 int prime[maxn];
     8 int pos;
     9 
    10 void init(){//线性筛选法
    11     for( ll i=2; i<maxn; i++ ){
    12         if(!check[i]){
    13             prime[pos++]=i;
    14         }
    15         for( ll j=0; j<pos&&i*prime[j]<maxn; j++ ){
    16             check[i*prime[j]]=1;
    17             if(i%prime[j]==0) break;
    18         }
    19     }
    20 }
    21 
    22 int main(){
    23     init();
    24     for(int k=1; k*10<maxn; k++ ){//k为公差
    25         for( int i=0; i<pos; i++ ){
    26             int flag=1,temp=prime[i];
    27             for( int j=1; j<10; j++ ){
    28                 if(temp+k>=maxn||check[temp+k]==1){
    29                     flag=0;
    30                     break;
    31                 }
    32                 else{
    33                     temp+=k;
    34                 }
    35             }
    36             if(flag==1){
    37                 cout<<k<<" "<<prime[i]<<endl;
    38             }
    39         }
    40     }
    41 
    42     return 0;
    43 }
    44 //210 199
    有些目标看似很遥远,但只要付出足够多的努力,这一切总有可能实现!
  • 相关阅读:
    Android开机自启动应用
    扫码登录原理
    前端性能优化
    关于android推送的一些心得
    抓包工具Fiddler及iphone设置
    Node.js介绍、优势、用途
    Yapi本地化部署及接口调试(亲测)
    前后端分离,几个常用的API管理系统
    WebGL之Threejs概述
    Eclipse汉化
  • 原文地址:https://www.cnblogs.com/Bravewtz/p/10344482.html
Copyright © 2011-2022 走看看