Csdn
上的一个问题
程序运行:
输入
n,
输出其和等于
n
的所有不增的正整数和式。例如,
n=4,
程序将输出:
4=4
;
4=3+1
4=2+2
4=2+1+1
4=1+1+1+1
但如果用递归方法
算法:
递归函数设置两个参数:参数
i
是本次递归调用要分解的数,参数
k
是本次递归调用将分
解出第 k 个和数。
解出第 k 个和数。
1)
对要分解的数
i
,可分解出来的数
j
共有
i
种可能选择,它们分别是:
i,i-1,...,2,1
。
但是为了保证分解出来的和数依次构成不增的正整数数列,则要求从
i
分解出来的和数
j
不能超过
a[k-1]
。为了保证上述要求对第一步
(k=1)
分解也成立,程序可以在
a[0]
中预置
n
,即第一个和数最大为
n
。
2)
在分解过程中,当分解出来的数
j=i
时,说明已完成一个完整的和式分解,应该将和式输出;当分解出来的数
j<i
时,说明还有
i-j
需要分解,并且分解出第
k+1
个以及之后的和数。
#include
<
stdio.h
>
#undef N
#define N 5
void rd( int i, int * b, int k) ... {
int j = 0;
int t = 0;
for(j=i;j>=1;j--)
if(j<=b[k-1])...{
b[k]=j;
if(j==i)
...{
printf("%d=%d",N, b[1]);
for(t=2;t<=k;t++)
printf("+%d", b[t]);
printf(" ");
}
else
rd(i-j, b, k+1); //继续分解的数是i-j,分解出第k+1个和数
}
}
int main( int argc, char * argv[])
... {
int b[N+1];
b[0]=N;
rd(N, b, 1);
return 0;
}
#undef N
#define N 5
void rd( int i, int * b, int k) ... {
int j = 0;
int t = 0;
for(j=i;j>=1;j--)
if(j<=b[k-1])...{
b[k]=j;
if(j==i)
...{
printf("%d=%d",N, b[1]);
for(t=2;t<=k;t++)
printf("+%d", b[t]);
printf(" ");
}
else
rd(i-j, b, k+1); //继续分解的数是i-j,分解出第k+1个和数
}
}
int main( int argc, char * argv[])
... {
int b[N+1];
b[0]=N;
rd(N, b, 1);
return 0;
}