7-37 整数分解为若干项之和 (20 分)

将一个正整数N分解成几个正整数相加,可以有多种分解方法,例如7=6+1,7=5+2,7=5+1+1,…。编程求出正整数N的所有整数分解式子。

输入格式:
每个输入包含一个测试用例,即正整数N (0<N≤30)。

输出格式:
按递增顺序输出N的所有整数分解式子。序列之前输出。每个式子由小到大相加,式子间用分号隔开,且每输出4个式子后换行。

输入样例:
7
输出样例:
7=1+1+1+1+1+1+1;7=1+1+1+1+1+2;7=1+1+1+1+3;7=1+1+1+2+2
7=1+1+1+4;7=1+1+2+3;7=1+1+5;7=1+2+2+2
7=1+2+4;7=1+3+3;7=1+6;7=2+2+3
7=2+5;7=3+4;7=7

#include<stdio.h>
#include<stdlib.h>
#include<math.h>

int times=0;
int all[100]={0};

/**
 * 	分支界限
 * 	给定某数字A(1≤A≤9)以及非负整数N(0≤N≤100000),
 * 	求数列之和S=A+AA+AAA+⋯+AA⋯A(N个A)。
 * 	例如A=1, N=3时,S=1+11+111=123。
 */

void getn(int start,int N,int leve,int sum){
	if(leve==N){
		return;
	}
	for(int i=start;i<=N;i++){
		if(sum+i<N){
			all[leve]=i;
			getn(i, N, leve+1,sum+i);
		}else if(sum+i==N){
			times++;
			printf("%d=",N);
			for(int j=0; j<leve; j++){
				printf("%d+",all[j]);
			}
			if(times<4){
				if(i==N)
					printf("%d",i);
				else
					printf("%d;",i);
			}else{
				printf("%d\n",i);
				times=0;
			}
			break;
		}else{
			break;
		}
	}
}
int main() {
	int N;//0< n  <=30
	scanf("%d",&N);
	getn(1, N, 0, 0);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_43209531/article/details/89299219