/*魔术师翻牌,魔术师将扑克中的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
}
}
评论