對於這道題目需要掌握的就是如何高效的求小於整數n的素數有多少個,然後通過有技巧的遍歷就可以很輕鬆的得到正確答案:
#include
#include
#include
#include
#include
using
namespace
std;
const
int maxn=1e4+5;
int prime[maxn];
int num=0;
void primes(int n)
for(int j=0;jif(prime[j]>v[i]||prime[j]>n/i) break;
v[i*prime[j]]=prime[j];}}
}int main()
else
if((prime[i]+prime[j])>n)
else
if((prime[i]+prime[j])1;
break;}}
}cout
<2
0;}
分析:
我採用的是線性求解小於等於n 的素數個數的方法,複雜度是o(n)級別的,通過篩查,得到了乙個素數數列,其實已經就是從小到大排序的了。這裡有兩個指標:i,j。
然後從最小的開始和最大的相加,倘若相等也就意味著可以i+1,j-1;倘若小於n,說明對於i來說j指向還不夠大,所以i+1,j不變;倘若大於n,說明對於i來說,j指向有點大,可以continue,使j- -;
分拆素數和 HDU 2098
problem 把乙個偶數拆成兩個不同素數的和,有幾種拆法呢?input 輸入包含一些正的偶數,其值不會超過10000,個數不會超過500,若遇0,則結束。output 對應每個偶數,輸出其拆成不同素數的個數,每個結果佔一行。sample input 30 26 0sample output3 2 ...
分拆素數和 HDU2098
link problem description 把乙個偶數拆成兩個不同素數的和,有幾種拆法呢?input 輸入包含一些正的偶數,其值不會超過10000,個數不會超過500,若遇0,則結束。output 對應每個偶數,輸出其拆成不同素數的個數,每個結果佔一行。sample input 30 26 0...
分拆素數和 HDU 2098
把乙個偶數拆成兩個不同素數的和,有幾種拆法呢?input 輸入包含一些正的偶數,其值不會超過10000,個數不會超過500,若遇0,則結束。output 對應每個偶數,輸出其拆成不同素數的個數,每個結果佔一行。sample input 30 260sample output3 2 題解 先寫乙個函式...