刷题刷出新高度,偷偷领先!偷偷领先!偷偷领先! 关注我们,悄悄成为最优秀的自己!

简答题

冠军魔术

2018年FISM(世界魔术大会)近景总冠军简纶廷的表演中有一个情节:以桌面上一根带子为界,当他将纸牌从带子的一边推到另一边时,纸牌会变成硬币;把硬币推回另一边会变成纸牌。

这里我们假设纸牌会变成等量的硬币,而硬币变成纸牌时,纸牌的数量会加倍。那么给定纸牌的初始数量,当他来回推了 N 次(来/回各算一次)后,手里拿的是纸牌还是硬币?数量是多少?

时间限制:1000

内存限制:65535

输入

输入在一行里给出两个正整数,分别是纸牌的初始数量和魔术师推送的次数。这里假设初始状态下魔术师手里全是纸牌。

输出

如果最后魔术师手里是纸牌,输出 0 和纸牌数量;如果是硬币,则输出 1 和硬币数量。数字间须有 1 个空格。题目保证结果数值不超出整型范围(即231-1)。

样例输入

样例1:

3 7

样例2:

8 4

样例输出

样例1:

1 24

样例2:

0 32

使用微信搜索喵呜刷题,轻松应对考试!

答案:

#include <stdio.h>

int main() {
    int cards, pushes, coins = 0, tempCards = 0;
    scanf("%d %d", &cards, &pushes);
    while (pushes > 0) {
        if (cards > 0) {  // If there are still cards left
            coins += cards;  // Convert all cards to coins
            cards = tempCards * 2;  // Double the number of cards after conversion
        } else {  // If there are only coins left
            tempCards = coins;  // Convert all coins back to cards temporarily
            coins = 0;  // Reset the number of coins to zero
        }
        pushes--;  // Reduce the number of pushes by one
    }
    if (cards > 0) {  // If there are still cards left after all pushes
        printf("0 %d\n", cards);  // Output the number of cards
    } else {  // If there are only coins left after all pushes
        printf("1 %d\n", coins);  // Output the number of coins
    }
    return 0;
}

解析:

这道题目可以通过模拟的方式来解答。首先读取纸牌的初始数量和魔术师推送的次数。然后使用一个循环来模拟每一次的推送过程。在每一次推送过程中,如果手里还有纸牌,就将所有的纸牌转换为硬币,并加倍纸牌的数量(为了下一次可能的转换)。如果手里全是硬币,就将所有的硬币转换回纸牌(暂时性的转换,因为下一次推送可能又会变回去)。最后根据手里是纸牌还是硬币来输出相应的结果。

创作类型:
原创

本文链接:冠军魔术 2018年FISM(世界魔术大会)近景总冠军简纶廷的表演中有一个情节:以桌面上一根带子为界

版权声明:本站点所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明文章出处。

让学习像火箭一样快速,微信扫码,获取考试解析、体验刷题服务,开启你的学习加速器!

分享考题
share