歌德巴赫猜想说任何一个不小于6的偶数都可以分解为两个奇素数之和。
对此问题扩展,如果一个整数能够表示成两个或多个素数之和,则得到一个素数和分解式。
对于一个给定的整数,输出所有这种素数和分解式。
注意,对于同构的分解只输出一次(比如5只有一个分解2 + 3,而3 + 2是2 + 3的同构分解式
)。
例如,对于整数8,可以作为如下三种分解:
(1) 8 = 2 + 2 + 2 + 2
(2) 8 = 2 + 3 + 3
(3) 8 = 3 + 5
#include "stdio.h"
#include "math.h"
#include "string.h"
#define N 1000
#define M 100
int odd[M];
int n;
void get(){
int i, j, t;
odd[0] = 2; n = 1;
i = 3;
while(n<M){
t = (int)sqrt(i);
for(j=0; odd[j]<=t; j++){
if(i%odd[j] == 0) break;
}
if(odd[j]>t)
odd[n++] = i;
i++;
}
}
int dp[N][N]; //dp[i][j]: i, end with odd[j]
int ans[M];
int c;
void show(int s, int l, int k){
int i;
if(!s){
for(i=l-1; i>=0; i--)
printf("%d ", ans[i]);
printf("\n");
c++;
return;
}
for(i=0; i<=k; i++){
if(dp[s][i]){
ans[l] = odd[i];
show(s-odd[i], l+1, i);
}
}
}
int main(){
int i, j, z;
int s;
get();
while(scanf("%d", &s), s>=4){
c = 0;
memset(dp, 0, sizeof(dp));
for(i=0; odd[i]<=s; i++)
dp[odd[i]][i] = 1;
for(i=2; i<=s; i++){
for(j=0; odd[j]<i; j++){
for(z=j; z>=0; z--){
dp[i][j] |= dp[i-odd[j]][z];
}
}
}
show(s, 0, j-1);
printf("共%d种分法!\n", c);
}
return 0;
}