编程爱好者营地-编程擂台 | |
---|---|
http://www.sina.com.cn 2004/04/30 16:38 中学生电脑 | |
各位新老朋友大家新年好!很高兴我们又相聚在“编程擂台”,更欢迎我们的新读者加入“编程擂台”,不断壮大编程爱好者队伍,不断提高大家的编程能力。OK,我们一起来看一看2003年第11期的打擂情况。呵呵,大家可能都已经注意到了,苏洋同学这次又保住了“最佳攻擂手”的位置,其他同学可要努力哦! 最佳攻擂手:苏洋江苏省连云港市灌云高中高二(2)班 Pascal源程序: program No11 var combomaxarray1..20of byte mniorderbyte begin write'Input nm'readlnnm读入数的总数n和取数的个数m for i=1 to m do gegin comboimaxi=n-m=i endcombo和max数组初始化 order=m下标指针指向combo数组最后一个元素 repeat if order=m then begin for i=1 to m do writecomboi3writeln end组合数的打印 if comboorder<maxorderthen begin inccomboorder如果comboorder未取到最大数时,则comboorder加1 if order<m then for order=order+1 to m do comboorder=comboorder-1+1 如果下标指针不是指向最后时,则comboorder等于前一个数加1 end else decorder如果comboorder已取到最大数时,则order指向前一个元素 until order=0直到combo数组的第一个元素也已取到最大值时停止循环 end. 程序运行结果举例: n=5 m=4 n=4 m=3 1 2 3 4 1 2 3 1 2 3 5 1 2 4 1 2 4 5 1 3 4 1 3 4 5 2 3 4 2 3 4 5 算法分析:以上程序先定义了一个数组combo用来存放组合数,假设combo中的元素由小到大排列,则combo1<combo2<…<combom,初始值为:12…m;最终值为:n-m+1n-m+2…n;由此可以看出1≤comboi≤n-m+ii=123…m;因此只要在取下一组值时,首先考虑comboi的递增变化,当comboi变化到最大值时考虑comboi-1comboi-2…的变化,这样做显然是为了让数递增排列,以保证不会出现相同的组合,即不考虑排列问题(如:1 2 3和3 2 1是同一种组合)。程序中用数组maxi来保存comboi可以取到的最大值,用order表示数组的下标指针,当order=0时就可以有序地输出各种不同的组合。另外,苏洋同学还利用递归循环数法设计了一个程序,因篇幅有限,不能刊登了,希望大家也动手试试。 优秀攻擂手 韩勇贵州省安顺市第一高中高二(12)班 张晴广西柳州市第八中学初三(12)班 本期擂台题目 有一段文字:“This is a disk.There is a desk.”。编写程序,找出这段文字中“is”出现的次数和在字符串中的位置。 请将上机调试通过的程序代码及运行结果誉写清楚,并简要写出你的编程思路和算法,寄往:重庆市渝中区双钢路3号课堂内外杂志社《中学生电脑》编辑部“编程擂台”栏目,邮编:400013,或发E-mail到pc_new@yesnew.com。 |