您的位置:首页 > 其它

整数的素数和分解问题

2012-09-07 18:56 495 查看
歌德巴赫猜想说任何一个不小于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

;  //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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: