和式分解
给定一个正整数n,输出和为n的所有不增的正整数和式。
【问题】
要求给定一个正整数n,输出和为n的左右不增的正整数和式。例如,n=5,则输出的和式结果为:
5=5
5=4+1
5=3+2
5=3+1+1
5=2+2+1
5=2+1+1+1
5=1+1+1+1+1
【分析】
这是2009年人民银行笔试题目,引入数组a,用来存放分解出来的和数,其中,a[k]存放第k分解出来的和数。递归函数应设置:第1个参数是数组名a,用来将数组中的元素传递给被调用函数;第2个参数i表示本次递归调用要分解出来的数;第3个参数k是本次递归调用将要分解出来的第k给和数。递归函数原型为:
void rd(int a[], int i, int k)
对将要分解的数i,可分解出来的数j共有i种可能选择,它们是i,i-1,...,2,1。但为了保证分解出来的和数依次构成不增的正整数数列,要求从i分解出来的和数j不超过a[k-1],即上次分解出来的和数。
特别是,为保证对第一步(k=1)分解成立,程序可在a[0]预置n,即第一个和数最大为n。在分解过程中,当分解出来的数j==i时,说明已经完成一个和式分解,应将和数输出;当分解出来的数j<i时,说明还有i-j行第k+1次分解。
code:
#include<stdio.h>
#include <iostream>
#define N 50
void rd(int a[], int i, int k);
void main()
{
int n, a[N];
printf("请输入一个正整数n(0<=n<50):");
scanf("%d", &n);
a[0] = n;
printf("和式分解结果:\n");
rd(a, n, 1);
system("pause");
}
void rd(int a[], int i, int k)
{
int j, p;
for (j = i; j >= 1; j--)
{
if (j <= a[k - 1])
{
a[k] = j;
if (j == i)
{
printf("%d=%d", a[0], a[1]);
for (p = 2; p <= k; p++)
printf("+%d", a[p]);
printf("\n");
}
else
rd(a, i - j, k + 1);
}
}
}
结果: