整数分解为若干项之和

一、题目描述

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

1.输入格式:

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

2.输出格式:

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

3.输入样例:

7

4.输出样例:

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

二、思路解析

根据题目中给出的输入输出样例,可以直观看出,需要采用递归来解决。
同时,可以看到,分解的因子是从小到大变化,因此,可以考虑加上循环一起来解决。
核心思路描述如下:

items数组:存储分解的各项值
count: 当前items存储的项数
func(剩余未分解的数值,第1个分解的数值,已分解的项数)
{
	if (剩余未分解的数值 > 0 ){
		for (从第1个分解的数值开始,直到小于剩余未分解的数值,递增)
		{
			将第1个分解的数值存入items数组;
			将(剩余未分解的数值-1个分解的数值)作为剩余未分解的数值,递归调用func函数;
		}
	}
	else {
		开始打印items数组;
		如果一行输出了4组分解的式子,则输出换行;
	}
}

可以看出,func在递归时,先调用了循环,逐步分解;在分解的同时,将分解的数值存入到items数组中,并使用count记录个数,因此,这两个变量需设置为全局变量。

三、所有代码

#include<stdio.h> 
# define MAX_SIZE 100

int items[MAX_SIZE];//保存每一项的数值
int count;			//当前输出式子个数 
int N;				//分解的整数


void f(int remain_value, int start, int num) {
	//remain_value: 表示剩余需要分解的数字
	// start:表示分解项的第一项
	//num:表示已经分解了多少项
	
	if(remain_value!=0) {

		//还没分解完
		for(int i=start; i<=remain_value; i++) {
			items[num] = i;
			f(remain_value-i, i, num+1);
		}
	}else{
		//remain==0,分解完毕
		//开始打印当前式子 
		count++;
		
			
		printf("%d=%d",N,items[0]);//打印式子头部 
		for(int j=1; j<num; j++){
			printf("+%d",items[j]);
		}
		if(count%4==0) 
			printf("\n");
        else if(count%4!=0&&items[0]!=N)
        printf(";");	
	}	
}

int main(){
	//题目:分解N 
	//思路:递归求解 	
	count=0;
    N = 7;
	// scanf("%d", &N);
	f(N, 1, 0);
	return 0;

}

感谢@谢依萍同学提供解题代码!

  • 20
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值