整数的素数和分解问题

歌德巴赫猜想说任何一个不小于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;
 }
 


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值