一、题目描述
将一个正整数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;
}
感谢@谢依萍同学提供解题代码!