等差素数数列

  • Post author:
  • Post category:其他


蓝桥杯 04/08/2017

标题:等差素数列

2,3,5,7,11,13……是素数序列。

类似:7,37,67,97,127,157 这样完全由素数组成的等差数列,叫等差素数数列。

上边的数列公差为30,长度为6。

2004年,格林与华人陶哲轩合作证明了:存在任意长度的素数等差数列。

这是数论领域一项惊人的成果!

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

长度为10的等差素数列,其公差最小值是多少? ——————即只需要求出最小公差值

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



有一个很关键的规律:对于长度为k的素数等差数列,它们的公差能被小于k的所有素数整除

详见

百度百科

完整代码: 另见

GitHub

// 对于长度为k的等差素数数列,
// 它的公差能被小于k的所有素数整除。
#include<iostream>
#include<vector>
using namespace std;

bool isSushu(int s);

int main() {
    int k;
    int n=0;
    int g=1;
    vector<int> su;
    vector<int> lie(k);
    cout<<"请输入等差素数列的长度:"<<endl;
    cin>>k;
    for(int i=2;i<k;i++) {
        if(isSushu(i)) {
            su.push_back(i);
        }
    }
    // 以下求出一个最小的能被所有小于序列长度k的素数整除的公差
    while(true) {
        int n=0;
        for(auto sus: su) {
            if(g%sus==0) n++;
        }
        if(n>=su.size()) {
            cout<<g<<endl;
            break;
        }
        else {
            n=0;
            g++;
        }
    }
    /*----以下是输出满足的序列----*/
    int ii;
    int i=2;
    int n1=0;
    ii=i;
    while(n1<k) {
        if(isSushu(ii)) {
            lie.push_back(ii);
            n1++;
            ii+=g;
        }
        else {
            lie.clear();
            n1=0;
            i=i+1;
            ii=i;
        }
    }
    for(auto i1:lie) cout<<i1<<' ';
    cout<<endl;
    return 0;
}

bool isSushu(int s) {
    int u;
    for(u=2;u<=s-1;u++) {
        if(s!=u && s%u==0) {
            return false;
        }
    }
    //printf("%d ",s);
    return true;
}



版权声明:本文为liberty1997原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。