用魔法币机器生产N个魔法币的问题

本文介绍了一个通过两台魔法机器生成特定数量魔法币的算法。机器1每次生成奇数个魔法币,而机器2生成偶数个。算法逆向计算如何通过最少的操作步骤达到目标数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



问题:有两台魔法机器可以通过投入X个魔法币产生更多的魔法币。X可以为零。

机器1:投入x个,生产2*x+1个

机器2:投入x个,生产2*x+2个

请设计一个方案,使得最后刚好拥有N个魔法币。

输入:输入包括一行,包括一个正数N(1<=N<=10^9)

输出:输出一个字符串,每个字符表示选取的机器编号。其中1表示机器1,2表示机器2。


示例:
输入:10
输出:122


分析过程:机器1只会生奇数个魔法币,机器2生产偶数个魔法币。假设当前魔法币有i个,投入j个:如果投入机器1,则魔法币数变为i+j+1;如果投入机器2,则变为i+j+2个。显然,存在关系j<=i。

反过来思考,当前魔法币个数为n的时候,则前一次魔法币个数m=n-step。为了尽可能地减少兑换次数,显然step越大越好,也就是优先选机器2,即step=j+2。

基于上述分析,计算方法如下:

步骤1 如果n是偶数,由于n = i+j + 2,则j最大为(n-2)/2,为了让步长step最大,则可令j等于此最大值

步骤2. 如果n是奇数,则相当于在拥有n-1魔法币的时候,投入0个币到机器1的结果。此时再倒推计算n-1是怎么选取的。进入步骤1

步骤3:当计算出来的i为零,即拥有魔法比个数为零,则逆推结束。

def getChoice(inputNum):
    choice = ''
    
    if inputNum %2 != 0:
        choice = '1'+choice
        inputNum -= 1
        
    if inputNum <= 0 : return 0, choice
    
    choice = '2'+choice
    j = (inputNum - 2)/2
    i = inputNum -2 - j
    return i, choice

while(1):
    print("pls input magic coin number, and input 0 when you want exit")
    n = int(input())
    if n == 0:break
    choiceResult=''
    while(n>0):
        restNum,curResult=getChoice(n)
        n = restNum
        choiceResult = curResult + choiceResult
    print("suggested choice is %s.\n" %(choiceResult))
===================== RESTART: D:\python\getMagicCoin.py =====================
pls input magic coin number, and input 0 when you want exit
1
suggested choice is 1.


pls input magic coin number, and input 0 when you want exit
2
suggested choice is 2.


pls input magic coin number, and input 0 when you want exit
3
suggested choice is 21.


pls input magic coin number, and input 0 when you want exit
10
suggested choice is 122.


pls input magic coin number, and input 0 when you want exit
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值