趣味算法二例 中奖彩球某商场欲举办抽奖促销活动。有人建议在一个口袋中放12个乒乓球,其中三个为红色,3 个为白色,6 个为黑色,要求从中任取8个,如果满足一定的颜色组合即中奖,这样的颜色组合共有多少种? 假设任意取出的球中红色球为i个,白色球为j个,黑色球的个数根据题意应为8-i-j个,并且红球和白球的个数取值范围是0 至3,在红球与白球个数确定的情况下黑球个数取值应为8-i-j=6.同样用穷举法,用二重循环求解这个问题。 代码如下:#include<stdio.h>main(){ int i,j,count=0; printf("\n RED BALL WH99vE BALL BLACK BALL\n"); printf("--------------------------\n"); for(i=0;i<=3;i++) /*i作为红球个数作为外层循环变量*/ for(j=0;j<=3;j++) /*j作为白球个数作为内层循环变量*/ if((8-i-j)<=6) /*如果黑球个数满足要求,打印该组合*/ printf("%2d:\t%d\t %D\n",++count,i,j,8-i-j);} 运行结果: RED WH99vE BLACK1 0 2 62 0 3 53 1 1 64 1 2 55 1 3 46 2 0 67 2 1 58 2 2 4 -------------------------------------------------------------魔术师的秘密在一次晚会上,一位魔术师掏出一叠扑克牌,取出其中13张黑桃,预先洗好后,把牌面朝下,对观众说:“我不看牌,只数一数就能知道每张牌是什么?”魔术师口中念一,将第一张牌翻过来看正好是A;魔术师将黑桃A放到桌上,继续数手里的余牌,第二次数1,2,将第一张牌放到这叠牌的下面,将第二张牌翻开,正好是黑桃2,也把它放在桌子上。第三次数1,2,3,前面二张牌放到这叠牌的下面,取出第三张牌,正好是黑桃3,这样依次将13张牌翻出,准确无误。现在的问题是,魔术师手中牌的原始顺序是怎样的? 解决这类问题的关键在于利用倒推的方法推出原来牌的顺序。假设桌上摆着13个空盒子,编 号为1至13,将黑桃A放入第一个盒子中,从下一个空盒子开始对空盒子计数,当数到第二个空盒子时,将黑桃2放入空盒子中,然后再从下一个空盒子开始对空盒子计数。顺序放入3,4,5等,直到全部放入13张牌,注意在计数时要跳过非空的盒子,只对空盒子计数,最后得到的牌在盒子中的顺序,就是魔术师手中原来牌的顺序。 计算机就是模拟这种行之有效的倒推方法的。 代码如下:#include<stdio.h>int a[14];main(){ int i,n,j=1; printf("The orginal order of cards is:\n"); for(i=1;i<=13;i++) /*i为空盒子的顺号*/ { n=1; do { if(j>13)j=1; if(a[j])j++; else { if(n==i)a[j]=i; j++; n++; }while(n<=i); } for(i=1;i<=13;i++) printf("%2d,",a[i]);}

评论