8-11 不变的魔术师

修改你为完成练习8-10而编写的程序,在调用函数make_great() 时,向它传递魔术师列表的副本。由于不想修改原始列表,请返回修改后的 列表,并将其存储到另一个列表中。分别使用这两个列表来调用show_magicians() ,确认一个列表包含的是原来的魔术师名字,而另一个列表包含的是添加了字 样“the Great”的魔术师名字。

magicians_name = ['xiao', 'hui', 'dong', 'xi']
new_magicians_name = []


def show_magicians(magicians):
    for magician in magicians:
        print(magician)
    print('\n')


show_magicians(magicians_name)


def make_magicians(magicians, new_magicians):
    while magicians:
        magician = magicians.pop()
        new_magicians.append("The Great " + magician)


make_magicians(magicians_name[:], new_magicians_name)
show_magicians(magicians_name)
show_magicians(new_magicians_name)

 

```markdown ### 题目重述 2018年FISM近景魔术冠军简纶廷的表演中,存在一个变换规则: - 初始状态魔术师手中全是**纸牌**。 - 当把物品从带子一边推到另一边时: - **纸牌 → 硬币**(数量不变- **硬币 → 纸牌**(数量**加倍**) 给定初始纸牌数量和总共推送次数 $ N $(来回各算一次),求最终手里是纸牌还是硬币?以及对应数量。 输出规则: - 如果是纸牌,输出 `0 数量` - 如果是硬币,输出 `1 数量` --- ### 给出答案(答案为带注释的代码块) ```java import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); // 读取初始纸牌数量和推送总次数 int initialCards = scanner.nextInt(); int N = scanner.nextInt(); // 当前持有的物品数量 long count = initialCards; // 标志当前持有物:true 表示纸牌,false 表示硬币 boolean isCard = true; // 模拟 N 次推送过程 for (int i = 0; i < N; i++) { if (isCard) { // 纸牌变硬币,数量不变 isCard = false; } else { // 硬币变纸牌,数量翻倍 count *= 2; isCard = true; } } // 输出结果 if (isCard) { System.out.println("0 " + count); } else { System.out.println("1 " + count); } } } ``` --- ### 代码解析 1. **状态模拟**:使用布尔变量 `isCard` 跟踪当前持有物类型。 2. **循环处理**:每轮根据当前类型决定转换行为: - 纸牌 → 硬币(状态切换,数量不变- 硬币 → 纸牌(状态切换,数量 ×2) 3. **数据类型安全**:使用 `long` 防止翻倍过程中整型溢出。 4. **输出匹配格式**:按最终状态输出 `0/1` 和数量。 例如输入 `1 3`: - 第1次:纸牌→硬币(1) - 第2次:硬币→纸牌(2) - 第3次:纸牌→硬币(2) → 输出 `1 2` --- ### 知识点(列出该代码中遇到的知识点) 1. **状态机思想**:用布尔变量控制两种状态间的交替转换。 2. **循环模拟过程**:对每一步操作进行迭代处理,适合解决时序问题。 3. **数据类型选择**:使用 `long` 避免多次翻倍导致的整型溢出($2^{31}-1$ 限制)。 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值