正文

一个实用的小程序--魔术师翻牌2005-12-05 17:29:00

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

分享到:

/*魔术师翻牌,魔术师将扑克中的13张黑桃预先排好,牌面朝下,放在手中,
第一次数一张牌翻过来刚刚好是A,放在桌面上;第二次数MAX>1张牌,把记数分别为1,2,。。。,
(MAX-1)的那些牌,依次 放在手中牌的下面,数MAX的牌,翻过来刚刚好是2,放在桌面上;
第三次也数MAX>1张牌,把记数分别为1,2,。。。,(MAX-1)的那些牌,依次 放在手中牌的下面,
数MAX的牌,翻过来刚刚好是3,放在桌面上;这样做下去,直到13张牌翻完为止,
此时桌面上的牌顺序刚刚好是A,2,3,4,5,6,7,8,9,10,J,Q,K。
请编程找出魔术师手中的13张牌的原始顺序...    */

#include <stdio.h>
#include <stdlib.h>
#define MAX 2
void Solve(int *Puke, int len); //此函数用来找出魔术师手中的13张牌的原始顺序
void show(int Puke[], int len); //此函数用来演示魔术师的翻牌顺序

int main(void)
{
  int side, Puke[13]={0}, *P_Puke=Puke;//用来存储13张牌
  Solve(P_Puke, 13);//此函数用来找出魔术师手中的13张牌的原始顺序
  printf("原始顺序 : ");
  for(side=0; side<13; side++)//输出13张牌的原始顺序
  printf("%d ",Puke[side]);
  printf("\n翻牌顺序 : ");
  show(Puke, 13);//此函数用来演示魔术师的翻牌顺序
  system("pause"); 
  return 0;
}

void Solve(int *Puke, int len)//此函数用来找出魔术师手中的13张牌的原始顺序
{
 int count=MAX, side=0; //分别表示计数器和下标
   int number; //牌的号码             
 
   for(number=1; number<=13; count = 1, number++)
   {
  while(count < MAX)//如果没到该数的数目,继续往下数
  {
   if(Puke[side%13] == 0)//如果该牌未拿出,依次数过去
    count++;
   side++; //不管该牌是否被拿出,下标都加1
  }
  while(Puke[side%13] != 0) //跳过已经拿出来的牌
   side++;
  Puke[side%13] = number;//此时side%13所对应的数组元素就是那张牌
 }
}

void show(int Puke[], int len) //此函数用来演示魔术师的翻牌顺序
{
 int count=MAX, side=0; //分别表示计数器和下标
   int number; //牌的号码                    

   for(number=1; number<=len; count = 1, number++)
   {
  while(count < MAX)//如果没到该数的数目,继续往下数
  {
   if(Puke[side%len] != 0)//如果该牌未拿出,依次数过去
    count++;
   side++; //不管该牌是否被拿出,下标都加1
  }
  while(Puke[side%len] == 0) //跳过已经拿出来的牌
   side++;
  printf("%d ",Puke[side%len]);//此时side%len所对应的数组元素就是那张牌
  Puke[side%len] = 0 ;   //把拿出来的牌做个记号,取值为0
 }
}

阅读(3267) | 评论(0)


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

评论

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