问题链接:HDU2098
哥德巴赫猜想说,大于2的偶数可以分解成两个素数之和。该问题求分解个数。
解决本问题,首先用Eratosthenes筛选法求得必要的素数,然后用试探法求可分解的个数。
对于输入的偶数sum而言,如果能够分解成两个素数之和,其中一个必然小于或等于sum/2,基于这个原理进行分解计数,最后求出所有的组合。
#include <stdio.h> #include <math.h> // Eratosthenes筛选法 void sieveofe(int p[], int n) { int i, j; p[0] = 0; p[1] = 0; p[2] = 1; // 初始化 for(i=3; i<=n; i++) { p[i++] = 1; p[i] = 0; } int max = sqrt(n); for(i=3; i<=max; i++){ if(p[i]) { for(j=i+i; j < n; j+=i) //进行筛选 p[j]=0; } } } #define MAX 10000 int main(void) { int p[MAX+1]; int sum, count, i; sieveofe(p, MAX); for(;;) { scanf("%d", &sum); if(sum == 0) break; count = 0; for(i=2; i<=sum / 2; i++) { if(p[i] && p[sum-i]) if(i != sum-i) count++; } printf("%d\n", count); } return 0; }