递归理解起来可能不是那么难,但每次去实现的时候就很容易出错。做了几道练习题,借此总结一番,也算是给自己增长一点使用经验。
题目描述:整数分解
Description
输出一个正整数n的分解形式。例如,当n=4时,输出: 4=4 4=3+1 4=2+2 4=2+1+1 4=1+1+1+1 共计 5 种形式。 当n=7时,共有15种形式。 当n=10时,共有42种形式。输入格式
一个整数n(1<=n<=10)。输出格式
n的全部分解形式,注意分解式中数字值大的排在前面,如第一个数字值相同,那么比较第二个数字。输入样例
4输出样例
4=4 4=3+1 4=2+2 4=2+1+1 4=1+1+1+1
思路:
这题首先想到的是使用递归来处理,但是怎么用呢?要如何处理数据呢?
我们借助一个辅助数组res[]和两个个辅助变量rem(剩余未分解的),k(数组下标)
先模拟走一下:
假设num= 4;
第一轮:res[0] = 4; rem = 0;k=0 ;输出
第二轮:res[0]=3,rem = 1;k+1;
进入递归res[1] = 1,rem=0;输出
......以此类推
代码:
#include <iostream>
using namespace std;
int n,res[15];
void dfs(int rem,int k){
/*rem 为当前剩余的还未被拆分的大小,k为存进数组的长度*/
if(rem==0){
printf("%d=",n); //控制格式
for(int i=0;i<k-1;i++){
printf("%d+",res[i]);
}
printf("%d\n",res[k-1]);
return ;
}
for(int i=rem;i>=1;i--){
if(k==0){
res[k] = i; //第一轮
dfs(rem-i,k+1);
}else if(i<=res[k-1]){ //保证前面的数字是由4依次递减到1
res[k] = i;
dfs(rem-i,k+1);
}
}
return ;
}
int main(){
cin>>n;
dfs(n,0);
return 0;
}