POJ 2739題解 小菜

2021-06-16 20:43:53 字數 1250 閱讀 1236

題意簡述

題目要求找出1到10000內數,有多少個素數組成的總數;比如3只有自己那就是3,比如41有2+3+5+7+11+13, 11+13+17,和41,那就是三個(加起來數是連續的素數)

演算法分析

主要還是考驗如何高效快速的得到素數表.下來就是如何得到開始計算的下標和把所有相加可能得出來。我先用的是樸素的,思考部分加上一些很高效的演算法

程式樣例

unsigned short isprime(unsigned short num)

if(i*i <= num)

return 0;

return 1;

}int main()

num[0]=j;

printf("%u\n",sizeof(short));

while(1)

else

}} for(k=i;k>0;--k)

}} printf("%hu\n",counter);

} return 0;

}

流程:

先把5000內素數,存入陣列中,期間演算法就是用for+樸素的取餘判斷(效率不高)。下來找到比需要查詢數小的數的下標。用來迴圈判斷組成可能。

note:為什麼是5000內呢,因為5000以上的數單獨判斷就行,要組成的話肯定是兩個加和小於10000的組合,所以5000內就夠用了

下來就是兩層迴圈,從剛才下標開始往前加,大了就從前乙個重來。直到開始下標小於1

指標:poj評定  176k 16ms(詭異的是第一次沒改前是0ms)

思考

樸素的判斷素數確實效率不高,經大大指導 知道了快速點的方法

篩選法

思路是,要求10000以內的所有素數,把1-10000這些數都列出來,1不是素數,劃掉;2是素數,所有2的倍數都不是素數,劃掉;取出下乙個倖存的數,劃掉它的所有倍數;直到所有倖存的數的倍數都被壞掉為止。完成了就可以直接用a[n] == 1來判斷素數了 效率確實很高

int i, tmp;

int a[10000]

memset(a, 0, sizeof(a));

a[0] = 1;

a[1] = 1;

for(i=2;i<10000;i++)

}}

不過這樣出來的素數陣列是離散的 中間有很多0 算加和的話,不知道影響大不。但是總體上肯定比我寫的效率高~

poj2739解題報告

include include include using namespace std const int max 10000 bool flag max 1 int a max 1 int size 0 void prime int max if n 0 return 0 else if sum ...

POJ 1088 滑雪 題解

poj1062 昂貴的聘禮 michael喜歡滑雪百這並不奇怪,因為滑雪的確很刺激。可是為了獲得速度,滑的區域必須向下傾斜,而且當你滑到坡底,你不得不再次走上坡或者等待公升降機來載你。michael想知道載乙個區域中最長底滑坡。區域由乙個二維陣列給出。陣列的每個數字代表點的高度。下面是乙個例子 1 ...

POJ 3278 題解 搜尋

牛 奶牛在k處不動 fj在n處去抓,最快要多長時間 某時刻fj的座標為x,fj有3種走法,每次每種走法1分鐘 往前走一步 往後走一步 傳送到2x處 time 1000 ms memory 65536 kb 搜尋 include include include include using namesp...