算法競賽---day1

聲明:最近有點小煩躁,學了這麼長時間的算法,連個皮毛都不知道掌握了沒有,漫無目的的學習,讓我自己開始懷疑自己在學習過程中是否走入了低效的陷阱,學以致用,我準備這陣子認真準備20年的藍橋杯,拿不拿獎無所謂,主要是以賽帶動高效學習,嗯。。。就以2017年的真題開始吧!
嘖嘖嘖,這B組第一題是什麼鬼??不想做。。。B組第二題,嗯。。。可以可以,那就從這裏開始吧:
題目:
2,3,5,7,11,13,…是素數序列。類似:7,37,67,97,127,157 這樣完全由素數組成的等差數列,叫等差素數數列。上邊的數列公差爲30,長度爲6。2004年,格林與華人陶哲軒合作證明了:存在任意長度的素數等差數列。這是數論領域一項驚人的成果!有這一理論爲基礎,請你藉助手中的計算機,滿懷信心地搜索:長度爲10的等差素數列,其公差最小值是多少?
注意:需要提交的是一個整數,不要填寫任何多餘的內容和說明文字。
分析:
這題我自己做的時候雖然沒有完全做對,但和最終結果也比較接近了,卡住我思路的關鍵是數學。。。
我沒有想到用數組來表標記素數;對等差數列的表示,理解也不深刻。。。
公差爲30,長度爲6。這句話能不能真正理解是解決本題的關鍵,只有挖掘出了a+i*d,i++才能很好的解決這題。
其實也就是一個高一學的的等差公式。。水平太次了,第二題就JJ了,好好積累吧。。。

//#include<bits/stdc++.h> 
#include<iostream>
#include<cmath>
#define N 100000
using namespace std;
int a[N];
bool isprime(int x){
	if(x<2){
		return false;
	}
	for(int i=2;i<sqrt(x);i++){
		if(x%i==0){
			return false; 
		}
	}
	return true;
}
int main(){
	int i,len,d;
	for(int i=2;i<N;i++){
		if(isprime(i)){
			a[i]=1;
		}
	}
	for(d=1;d<N;d++){
		for(i=2;i<N;i++){
			for(len=0;len<10;len++){
				if(a[i+d*len]!=1){
					break;
				}
			}
			if(len==10){
				cout<<d;
				return 0;
			}
		}
	}
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章