c++ 分解数2
题目描述
输入自然数n,然后将其分拆成由若干数相加的形式,参与加法运算的数可以重复
例如将一个正整数N分解成几个正整数相加,可以有多种分解方法,例如7=1+6,7=2+5,7=1+1+5,…。编程求出正整数N的所有整数分解式子。
输入
输入
待拆分的自然数n ( 1 < n < = 50 )
输出
若干数的加法式子(注意观察输出的顺序)。
样例输入
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
Source Code
#include <stdio.h>
#define MAX 10 //最多能拆分10个数
int a[MAX];
int n,top=-1,sum=0;
void dfs(int i)
{
if(sum==n)//如果分解的数加起来等于n (n:要分解的数)
{
printf("%d=",n);
for(int j=0;j<top;j++)//输出这些分解的数
printf("%d+",a[j]);
printf("%d\n",a[top]);//单独输出因为最后一个数后面没有加号,并且需要回车
return;
}
if(sum>n)//如果分解出来的数大于n
return;//返回
for(int k=i;k<=n;k++)
{
top=top+1;//移动当前要分解数的位置(栈里面的位置)
a[top]=k;//给当前位置赋值
sum=sum+k;//sum就是分解出来数加起来的和,把现在这个拆出来的数累加进去
dfs(k);//当前位置选k
sum=sum-k;//当前位置判断结束后,再判断上一个数,所以将当前位置的值从sum中移除
top--;//当前位置的数被循环赋值并判断后再选择上一个数
}
}
int main()
{
scanf("%d",&n);//n是要分解的数
dfs(1);//当前位置选1
return 0;
}