首页 > 试题广场 >

魔法币

[编程题]魔法币
  • 热度指数:414 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
小易准备去魔法王国采购魔法神器,购买魔法神器需要使用魔法币,但是小易现在一枚魔法币都没有,但是小易有两台魔法机器可以通过投入x(x可以为0)个魔法币产生更多的魔法币。
魔法机器1:如果投入x个魔法币,魔法机器会将其变为2x+1个魔法币
魔法机器2:如果投入x个魔法币,魔法机器会将其变为2x+2个魔法币
小易采购魔法神器总共需要n个魔法币,所以小易只能通过两台魔法机器产生恰好n个魔法币,小易需要你帮他设计一个投入方案使他最后恰好拥有n个魔法币。

输入描述:
输入包括一行,包括一个正整数n(1 ≤ n ≤ 10^9),表示小易需要的魔法币数量。


输出描述:
输出一个字符串,每个字符表示该次小易选取投入的魔法机器。其中只包含字符'1'和'2'。
示例1

输入

10

输出

122
target = int(input())
# 变成偶数那一步一定是用了2,变成奇数那一步一定是用了1
result = []
while target:
    if target % 2 == 0:
        # 是偶数,用了2
        result.append(2)
        target = (target - 2) / 2
    else:
        result.append(1)
        target = (target - 1) / 2

for i in range(len(result) - 1, -1, -1):
    print(result[i], end='')
编辑于 2018-08-07 16:20:08 回复(0)
def machine1(x): return int((x-1)/2) def machine2(x): return int((x-2)/2) if __name__ == "main":
out = []
n = eval(input('请输入几个魔法币\n')) while n: if n%2==1:
        n = machine1(n)
        out.append('1') print(n) if n%2==0:
        n = machine2(n)
        out.append('2') print('2')
out.reverse()
res = ''.join(out) print(res)
发表于 2019-09-04 16:46:07 回复(0)
# 倒推
num = int(input())
res = '' 
while num > 0:  
    if num % 2 == 0:  
        res = '2' + res
        num = (num-2)//2  
    else:  
        res = '1' + res
        num = (num-1)//2
print(res)

编辑于 2018-08-08 09:16:59 回复(1)
7ai头像 7ai
倒推法
num = int(input())
result = []
while num:
    if num%2==0:                 #最后一次使用机器获得n(偶数)个魔法币
        result.append(2)
        num = (num-2)//2    #倒推需要多少魔法币才可以获得n个魔法币
    else:                         #最后一次使用机器获得n(奇数)个魔法币
        result.append(1)
        num = (num-1)//2    #倒推需要多少魔法币才可以获得n个魔法币

print(''.join(map(str,result[::-1])))#反向输出

编辑于 2022-09-11 14:17:00 回复(0)
def f1(x):
    return int((x - 1)/2)
def f2(x):
    return int((x - 2)/2)

def s1(n, s):
    while n % 2 == 1:
        n = f1(n)
        s = s + '1'
    return n, s
def s2(n, s): 
    while n % 2 == 0 and n != 0:
        n = f2(n)
        s = s + '2'
    return n, s



n = int(input())

s = ''
for i in range(30): # 2**30 > 10**9
    if n != 0:
        if n % 2 == 0:
            n, s = s2(n, s)
            
        elif n % 2 == 1:
            n, s = s1(n, s)

s = s[::-1]
print(s)

发表于 2020-03-29 20:34:31 回复(0)