2017藍橋杯省賽B組 --- 等差素數列

標題:等差素數列
2,3,5,7,11,13,….是素數序列。
類似:7,37,67,97,127,157 這樣完全由素數組成的等差數列,叫等差素數數列。
上邊的數列公差爲30,長度爲6。
2004年,格林與華人陶哲軒合作證明了:存在任意長度的素數等差數列。
這是數論領域一項驚人的成果!
有這一理論爲基礎,請你藉助手中的計算機,滿懷信心地搜索:
長度爲10的等差素數列,其公差最小值是多少?
注意:需要提交的是一個整數,不要填寫任何多餘的內容和說明文字。

這題 先用循環 枚舉出 10 ^ 6次方以內的素數
然後將素數用 數組 存起來 再枚舉

這題答案是: 210

#include<iostream>
using namespace std;
bool num[100010] = {false}; // 存放 素數 
void create(){// 生成素數 
    int i = 0;
    int j = 0;
    int x = 0;
    for( i = 101; i < 100000; i +=2){
        x = sqrt(i);
        for(j = 2; j < x; j++ ){
            if(i % j == 0){
                break;
            }   
            if(j != 2)
                j++;
        }
        if(j >= x){
            num[i] = true;
        }
    }
} 
int main(){
    create();// 生成素數 
    int j = 0;
    int d = 1;
    int count = 0;
    int temp[15] = {0}; // 存放 已經找到 的 素數列
    int i = 101;
    while(1){
        for(i = i + 2; i < 100000; i += 2){// 找出 之前 生成的素數 
            if(num[i])  // 給出 素數 下標  及其值 
                break;
        }
        for(d = 30; d < 1000; d++){ //  公差 看題 估計 爲 30 - 1000 之間  這裏 上限無所謂給多大都可以 
            for(j = i, count = 0; ; j+=d){
                if(count == 10)     // 如果 找到 10 個連續的 就退出 
                    break;
                temp[count] = j;//  存放找到的素數 
                if(!num[j]){    // 如果 當前索引沒有素數 就退出 
                    break; 
                }else
                    count++;    // 否則 連續的個數 加一 
            }
            if(count == 10){// 如果找到連續 的 10個就退出 
                cout << d << endl;
                for(int x = 0; x < 10; x ++){
                    cout << temp[x] << "\t";// 打印找到  的  素數 
                }
                return 0;
            }
        }
    }
    return 0;
}

第二次看到這個題 的解法 只改了 一個循環 但是 速度卻快了 幾倍
還是暴力枚舉 出10^6 以內的素數

#include<bits/stdc++.h>
using namespace std;
long n = 100000;// 生成素數的上限值
bool num[100000+10] = {false};
int i = 0, j = 0, temp = 0, x = 0;
void f(){ // 枚舉出所有的 素數
    for(i = 101; i < n; i += 2){
        temp = sqrt(i);
        for(j = 2; j < temp; j++){
            if(i % j == 0)
             break;
        }
        if(j >= temp){
            num[i] = true;
        }
     }
}
int main(){

    // 等差 素數 第 二種解法::  求連續 的 10個 數,, 那麼可以 枚舉 公差 ,
    // An = A1 + (n - 1) * d ;// 等差 公式
    f();
    x = 101;
    while(1){
        // 找出起始 素數
        for(x = x + 2; x < n; x +=2){// 和上面一樣 找出 要 枚舉 的素數
            if(num[x])
                break;
        }
        //細微改動的循環
        for(i = 31; i < 1000 ; i++){ // 枚舉公差
            for(j = 0; j < 10; j++){// 枚舉 連續次數
                if(!num[x + (i * j)]){//這裏取代了上面複雜的幾個判斷 更簡潔 
                    break;
                }
            }
            if(j == 10){
                cout << i << endl;
                return 0;
            }
        }

    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章