算法競賽---day2

篤定,專注,少言。。。
不要懊悔,不要嫉妒,不要焦慮,既然篤定了自己的目標和大致規劃,就要全身心的投入,不要被周圍環境所影響,該是你的跑不掉。。。
上次練習的17年的B組第二題,這幾天我在論壇還看到另一種求素數的方法,那個博主還是牛逼的,他分析了傳統求素數的弊端即對於大範圍單個判素數,耗時太大,然後提出用素數篩來暴力打表會省時很多,他還提出了優化的素數篩,反正我也不太懂,只知道他這種做法大致就是先把範圍內的合數做標記,剩下的就都是素數,因爲素數的倍數都是合數,所以在設計程序時,剔除合數就有了思路。具體爲啥,我也是迷迷糊糊,可能一次性標記完了,比一個一個標記要快很多,反正以後判斷素數,首選素數篩就完事了唄,其實對於藍橋杯這題影響不是很大,因爲這是一個填空題,而且數據還小,就當拓展學習了,其他的思路還是和原來一樣,我把代碼放下面(代碼註釋裏面有我編碼時的一些想法)供參考:

//#include<bits/stdc++.h> 
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int prime[10010],p[10010],len=0;
void isprime(){
	memset(p,0,sizeof(p));
	p[0]=p[1]=1;//素數標記爲0 合數數標記爲1 0,1標記爲1 因爲是素數篩
	for(int i=2;i<10000;i++){
		if(p[i]){
			continue;//尋找素數 
		}
		for(int j=i;j*i<10000;j++){
			p[i*j]=1;//素數的倍數都是合數 j從i開始是爲了避免重複 j*i而不是j是爲了減少判斷 
		} 
		prime[len++]=i;//將素數存入素數數組 
	} 
}
int main(){
	isprime();//素數篩 
	for(int i=0;i<len;i++){
		printf("%d ",prime[i]);//打印篩選出的素數 
	}
	cout<<endl; 
	for(int i=0;i<len;i++){//len個素數 
		int x=prime[i];
		for(int d=1;d<1000;d++){
			int j;
			for(j=1;j<10;j++){
				if(p[x+d*j]){//等差數列通項公式:首項(素數)+公差*項數。 
					break;
				}
			}
			if(j==10){
				printf("%d %d",d,x);
				return 0;//這裏很關鍵! 
			}
		}
	} 
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章