魔术师

来源:CP1251魔术师(难度:中等)

魔术师

Description
魔术师利用一副牌中的13张红桃,预先将它们排好后迭在一起,牌面朝下。对观众说:“我不看牌”,只数数就可以猜到每张牌是什么,我大声数,你们听,不信?你们就看。魔术师将最上面的那张牌数为1,把它翻过来正好是红桃A,将红桃A放在桌子上,然后按顺序从上到下数手中的余牌,第二次数1、2,将第一张牌放在这迭牌的下面,将第二张牌翻过来,正好是红桃2,也将它放在桌子上。第三次数1、2、3,将前面两张依次放在这迭牌的下面,再翻第三张牌正好是红桃3.这样依次将13张牌全翻出来,准确无误。问魔术师手中的牌原始次序是怎样安排的?

Input
无

Output
输出格式要求:"%d "(%d后面有一个空格),全部数据输出后再输出一个换行"\n"
点击查看代码
#include <stdio.h>
#include <stdlib.h>

int main()
{
    int number[13],i,j,pointer=0,count=0;
    for(i=0; i<13; i++)
    {
        number[i]=0;
    }
    for(i=1; i<=13; i++)
    {
        do
        {
            pointer++;
            if(pointer>13)
                pointer%=13;
            if(number[pointer-1]==0)
                count++;
        }
        while(count!=i);
        number[pointer-1]=i;
        count=0;
    }
    for(i=0; i<13; i++)
    {
        printf("%d ",number[i]);
    }
    printf("\n");
    return 0;
}
点击查看流程
这段代码使用了一个指针和计数器来模拟魔术师数牌的过程。
具体方法如下:
1.首先,创建一个长度为13的数组number,用来存储牌的原始次序。
2.初始化数组number中的元素为0,表示牌还未被翻开。
3.接下来,使用一个循环来模拟魔术师数牌的过程。
4.在循环中,首先将指针pointer加1,表示魔术师从上一张牌数到下一张牌。
5.如果指针超过了13,则将其取余数,使其在1到13之间循环。
6.如果当前指针对应的牌还未被翻开(即数组number中的值为0),则计数器count加1。
7.当计数器count等于魔术师数到的数字i时,表示数到了第i张牌。
8.将第i张牌的数字i赋值给指针对应的位置,并将计数器count重置为0。
9.重复以上步骤,直到所有牌都被翻开且赋值完毕。
10.最后,输出数组number中的元素,即为牌的原始次序。

这道题中,“指针”的想法来源于我在草稿纸上演算时,类似于笔尖的作用。
“0”的使用是我想到还没翻开的牌,可以使用一个数0或负数来指代,这样的话已经翻开的牌是正数,可以跳过。

posted @ 2024-01-09 16:55  20231420  阅读(28)  评论(0编辑  收藏  举报