題目:把一个偶数拆成两个不同素数的和,有几种拆法。
分析:數論。利用篩法打標,然後利用二分查找即可。
說明:╮(╯▽╰)╭;
#include <iostream>
#include <cstdlib>
using namespace std;
int used[10001], prim[1230];
int makelist()
{
int count = 0;
memset(used, 0, sizeof(used));
for (int i = 2; i < 10001; ++ i)
if (!used[i]) {
prim[count ++] = i;
for (int j = i*i; j < 10001; j += i)
used[j] = 1;
}
return count;
}
bool find(int key, int l, int h)
{
int m;
while (l <= h) {
m = (l+h)>>1;
if (prim[m] == key)
return true;
if (prim[m] > key)
h = m-1;
else l = m+1;
}
return false;
}
int main()
{
int size = makelist();
int n;
while (cin >> n && n) {
int count = 0;
for (int i = 0; i < size; ++ i)
if (find(n-prim[i], i+1, size-1))
++ count;
cout << count << endl;
}
return 0;
}