96年的一个考研题目!请教完整程序写法!

didazy 2005-07-14 09:28:50
程序说明
对于正整数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{}中的一个完整和式的和数输出。当还需要进一步分解时,以要进一步分解的数及分解深度为参数,递归调用分解和式函数。
函数ND()以要分解的数为参数,另开设一个数组R{},用于存储当前还未分解的余数。在求一个解的第K步时,A{K}为第K个和数,R{K}为相应的余数。当找到一个分解后(此步R{K}等于0),输出解,并作回溯处理,从当前K退回到第一个不为1的和数,将其减1,并将其余数加1,准备去找另一个解,否则,生成下一步的分解和数与余数.
...全文
260 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
K 2005-07-15
  • 打赏
  • 举报
回复
、阅读下列程序说明和C程序,把应填入其中方框处的字句,写在答卷的对应栏内。
[程序说明]
对于正整数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{}中的一个完整和式的和数输出。当还需要进一步分解时,以要进一步分解的数及分解深度为参数,递归调用分解和式函数。
函数ND()以要分解的数为参数,另开设一个数组R{},用于存储当前还未分解的余数。在求一个解的第K步时,A{K}为第K个和数,R{K}为相应的余数。当找到一个分解后(此步R{K}等于0),输出解,并作回溯处理,从当前K退回到第一个不为1的和数,将其减1,并将其余数加1,准备去找另一个解,否则,生成下一步的分解和数与余数。(15分)
答:(1)----------(2)--------------
(3)----------(4)--------------
(5)----------(6)--------------
[程序]
#defin MAXN 100
int a[MAXN],a[MAXN];
rd(int n,int k)
{ int j,i;
for(j=(1);j>=1;j--)
{a[k]=j;
if( (2) )
{ printf("%d=%d",a[0],a[1]};
for(i=2;i <=k;i++)
printf(" +%d",a[i]);
printf("\n");
eise(3)
}
}
nd(int n)
{ int i,k;
k=0; r[0] =n;
do
{ if ( (4) )
{printf("%d=%d",a[0],a[1]);
for(i=2;i <=k;i++)
printf(".+ %d",a[i]);
printf("\n");
while (k >0 &&(5) ) k--;
if (k > 0) {a(k)--;r(k)++;}
}
else { a[k+1] =(6);
r[k+1] = r[k] -a[k+1];
k++;
}
} while (k >0);
}
int test_data[] = {3,4,5};
main()
{ int i;
for(i =0;i < sizeof (test_data)/sizeof(int);i++)
{ a[0] =test_data[i];
rd(test_data[i],1);
printf("\n________________\n\n");
nd(test_data[i]);
printf("\n________________\n\n")
}
}
boxban 2005-07-15
  • 打赏
  • 举报
回复
#define MAXN 100
int a[MAXN], r[MAXN];
void rd(int n,int k)
{ int j,i;
for(j = n; j >= 1; j--)//for(j=(1);j>=1;j--)
{a[k]=j;
if ((n - a[k]) == 0)//if( (2) )
{ printf("%d=%d",a[0],a[1]);
for(i=2;i <=k;i++)
printf(" +%d",a[i]);
printf("\n");}
else{
int m = k;
int x = n - a[k];
while((x > a[k])){
a[k+1] = a[k];
x -= a[++k];
};
rd(x, k+1); k = m;}//eise(3)
}
}

void nd(int n)
{ int i,k;
k=0; r[0] =n;
do
{
if(a[k] == 0)//if ( (4) )
{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--;//while (k >0 &&(5) ) k--;
if (k > 0) {a[k]--;r[k]++;}
}
else { a[k+1] = (r[k] > a[k] ? a[k] : r[k]);//a[k+1] =(6);
r[k+1] = r[k] -a[k+1];
k++;
}
} while (k >0);
}
didazy 2005-07-14
  • 打赏
  • 举报
回复
#define MAXN 100
int a[MAXN],r[MAXN];
rd(int n,int k)
{
int j,i;
for(j=n;j>=1;j--)
{ a[k]=j;
if(a[k]=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);
}
}
nd(int n)
{int i,k;
k=0;r[0]=n;
do
{
if(r[k]==0)
{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+1]=r[k]-a[k+1];
k++;
}
} while(k>0);
};
int test_data[]={3,4,5};
main()
{int i;
for(i=0;i<sizeof(test_data)/sizeof(int);i++)
{a[0]=test_data[i];
rd(test_data[i],1);
printf("\n________\n\n");
nd(test_data[i]);
printf("\n________\n\n");
}
}

69,368

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧