📄 subject_66531.htm
字号:
<p>
序号:66531 发表者:ljl 发表日期:2003-12-25 09:41:06
<br>主题:数据排列组合问题
<br>内容:n个自然数中r个数的组合,要求数不相同,递减排列。如:n = 5, r = 3, 所有组合为:<BR><BR>5 4 3<BR>5 4 2<BR>5 4 1<BR>5 3 2<BR>5 3 1<BR>5 2 1<BR>4 3 2<BR>4 3 1<BR>4 2 1<BR>3 2 1<BR><BR>看到一本书上用递归法的程序如下:<BR><BR>#include <stdio.h><BR><BR>//递归法<BR>void comb( int n, int r )<BR>{<BR> int i;<BR> <BR> for( i = n; i >= r; i-- )<BR> {<BR> //看不明白这一段,k如何在外部定义?<BR> if(( i != n) && ( k != r )) //k为过程外定义的<BR> {<BR> int temp;<BR> for( temp = 1; temp <= ( k - r ) * 3; temp++ )<BR> printf(" ");<BR> }<BR> <BR> printf(" %3d", i );<BR><BR> if( r > 1 )<BR> comb( i - 1, r - 1 ); //递推到i-1个数<BR> else<BR> printf(" \n");<BR> }<BR>}<BR><BR>main()<BR>{<BR>// int a, b;<BR>// scanf( "%d %d", &a, &b );<BR><BR> comb( 5, 3 );<BR> <BR>}<BR>
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
回复者:ljl 回复日期:2003-12-25 11:11:05
<br>内容://解决后方案,送分唠~~~~<BR><BR>#include <stdio.h><BR><BR>int k; //全局变量,保存最原始的每行个数r(不是迭代过程中的)<BR><BR>//递归法<BR>void comb( int n, int r )<BR>{<BR> int i;<BR><BR> for( i = n; i >= r; i-- )<BR> {<BR> //打印和上一行相同部分的位置为空格<BR> if(( i != n) && ( k != r )) //k为过程外定义的<BR> {<BR> int temp; <BR> for( temp = 1; temp <= ( k - r ) * 3; temp++ )//这里的3是对应的printf("%3d", i );中的3<BR> printf(" ");<BR> }<BR> <BR> printf("%3d", i );<BR><BR> if( r > 1 )<BR> comb( i - 1, r - 1 ); //递推到i-1个数<BR> else<BR> printf(" \n");<BR> }<BR>}<BR><BR>main()<BR>{<BR> int a, b;<BR> scanf( "%d %d", &a, &b );<BR><BR> k = b; <BR> comb( a, b ); <BR>}<BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
<font color=red>答案被接受</font><br>回复者:Cxt_ann 回复日期:2003-12-25 11:12:19
<br>内容:收藏收藏:)
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:林建华 回复日期:2003-12-25 11:14:10
<br>内容:好像少打出来点东西
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:ljl 回复日期:2003-12-25 13:16:52
<br>内容:<BLOCKQUOTE>引用“第3楼”所言<BR><Q>好像少打出来点东西</Q></BLOCKQUOTE><BR><BR>的确,我在考虑如何打印出相同的部分ing~~~
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:林建华 回复日期:2003-12-25 13:21:35
<br>内容:用个数组存,最后在<BR><BR> if( r > 1 )<BR> comb( i - 1, r - 1 ); //递推到i-1个数<BR> else<BR> 一起打印,其他地方不打印
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:ljl 回复日期:2003-12-25 15:18:30
<br>内容://调了半天,才通过:((<BR><BR>#include <stdio.h><BR><BR>int k; //全局变量,保存最原始的每行个数r<BR>int one[5] ; //保存“相同”的数<BR>int count = 0; //必须在这里初始化!!!<BR><BR>//递归法<BR>void comb( int n, int r )<BR>{<BR> int temp; <BR> int i;<BR><BR> for( i = n; i >= r; i-- )<BR> {<BR> if(( i != n) && ( k != r )) //k为过程外定义的<BR> for( temp = 0; temp <= k - r - 1 ; temp++ )//打印重合的部分<BR> printf("%3d", one[temp]);<BR> <BR> printf("%3d", i );<BR><BR> if( count < k - 1 ) <BR> {<BR> one[count] = i;<BR> count++;<BR> }<BR><BR> if( r > 1 )<BR> comb( i - 1, r - 1 ); //递推到i-1个数<BR> else<BR> printf("\n");<BR> }<BR><BR> count--; //退一级相应的就减1,“腾”出相应的临时数组位置存放对应的i<BR>}<BR><BR>main()<BR>{<BR> int a, b;<BR><BR> printf("自然数的个数a: ");<BR> scanf( "%d", &a );<BR> printf("请输入组合数: ");<BR> scanf( "%d", &b );<BR><BR> k = b;<BR> <BR> printf("\n对应的排列如下\n");<BR> printf("----------------\n");<BR> comb( a, b );<BR> printf("\n");<BR>}<BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:林建华 回复日期:2003-12-25 15:31:25
<br>内容::)
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -