正文

趣味算法二例2007-04-27 20:36:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/andyhou/25279.html

分享到:

趣味算法二例 中奖彩球某商场欲举办抽奖促销活动。有人建议在一个口袋中放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]);}

阅读(2234) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册