題意簡述
題目要求找出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...