蓝桥杯day20_素数列的整合

数列思考

1:对于任意区间(1-1000000)之间查找满足特殊条件的子数列组合,一般我们使用暴力遍历的方法。
2:两层循环分别对应子数列的 初始位置 和 对应公差。不同的特殊条件,这两层的内外分布有所不同。

题目:范围内找所有长度为6的子素数列

素数列,即每一个数都是素数,额外添加一个判断素数的函数即可。

#include <bits/stdc++.h>

using namespace std;

bool check(int num)  // 检查素数
{
    for(int i=2;i<=sqrt(num); i++)  //取开根数就OK了
        if(num%i == 0)
            return false;
    return true;
}

int main()
{

    for(int i=10; i<=1000;i++) //范围从10到1000  1:因为从小到大输入,初始位置放在外层循环
    {
        for(int j=1; j<167; j++)//公差为1开始
        {
            int k;
            for(k=0;k<6; k++)   //长度为6
                if(!check(i+j*k))   //判断素数
                    break;
            if(k==6 && (i+5*j)<1000)    //在范围内(1000内)找到合适的数列了
            {
                for(int m=0; m<6; m++)
                    cout<<i+m*j<<" ";  
                cout<<endl;     //对于多组数据别忘了回车放在每组数据后
            }
        }
    }
    return 0;
}

题目:长度为10 的等差素数列

2,3,5,7,11,13,….是素数序列。 类似:7,37,67,97,127,157 这样完全由素数组成的等差数列,叫等差素数数列。
上边的数列公差为30,长度为6。
2004年,格林与华人陶哲轩合作证明了:存在任意长度的素数等差数列。 这是数论领域一项惊人的成果!
有这一理论为基础,请你借助手中的计算机,满怀信心地搜索:
长度为10的等差素数列,其公差最小值是多少?

#include <bits/stdc++.h>
using namespace std;
int arr[1000000];
int isNum(int x)
{
    for(int i = 2; i <=sqrt(x); i++) {
        if(x%i == 0) {
            return 0;
        }
    }
    return 1;
}

int main()
{
    for(int i = 2; i < 100000; i++) {
        if( isNum(i) ) {
            arr[i] = 1;   //说明i为素数  赋1
        }
    }

    for(int cha = 1; cha < 10000; cha++) { //公差 1:因为求解最小公差,因此放在外层循环
        for(int i = 2; i < 100000; i++ ) {  //起始位置,每一个公差均从起始位置查,为内层循环
            int count;
            for(count= 0 ; count < 10; count++) {
                if(!arr[ i+count*cha ]) {  //非素数,就不向下查了
                    break;
                }
            }
            if(count == 10 && i+cha*9<100000) {//满足10个数且最大值小于100000
                cout << cha;
                return 0;
            }
        }
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值