標題:等差素數列
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;
}
}
}