对于正整数N,输出其和等于N且满足以下限制条件的所有正整数的和式

来源:互联网 发布:人族剑士捏脸数据 编辑:程序博客网 时间:2024/05/22 01:58
对于正整数N,输出其和等于N且满足以下限制条件的所有正整数的和式,即组成和式的数字自左至右构成一个非递增的序列。如N=4,程序输出为:
4=4
4=3+1
4=2+2
4=2+1+1
4=1+1+1+1
程序中分别采用递归和非递归解法的两个函数RD()和ND()。

函数RD()采用递归解法,它有两个参数N和K。其意义分别是被分解和式的数N,及当前第K度分解。算法思想是对N的所有合理的和式分解,将分解出的数(称为和数)存于数组A{}中。当其中一个分解已不再需要进一步分解时,即找到一个解,将存于数组A{}中的一个完整和式的和数输出。当还需要进一步分解时,以要进一步分解的数及分解深度为参数,递归调用分解和式函数。

int a[100],r[100];
void rd(int n,int k)
{
    int i = 0,j = 0;
for(j = n<a[k-1]?n:a[k-1];j>=1;j--)         //!!!!!!!!!
{
a[k] = j;
if(j == n)
{
printf("%d = %d",a[0],a[1]);
for(i = 2;i <= k;i++)                   //!!!!!!!!!!!!!!!!!!!!!!
{
printf("+%d",a[i]);
}
printf("\n");
}
else
{
rd(n-j,k+1);     //!!!!!!!!!!!!!!!!!!!!
}
}
}


void nd(int n)
{
int i =0;
int k = 0;
r[0] = n;
do{ 
if(r[k]== 0)            //!!!!!!!!!!!!1
{
printf("%d = %d ",a[0],a[1]);
for(i = 2;i <=k;i++)
{
printf("+%d",a[i]);
}
printf("\n");
while(k > 0&&a[k] == 1)       //!!!!!!!!!!!!
{
k--;
}
if(k > 0)
{
a[k]--;
r[k]++;
}
}
else
{
a[k+1] = a[k] < r[k]?a[k]:r[k];
r[k+1] = r[k] - a[k+1];
k++;
}
}
while(k>0);
}


阅读全文
0 0
原创粉丝点击