小易准备去魔法王国采购魔法神器,购买魔法神器需要使用魔法币,但是小易现在一枚魔法币都没有,但是小易有两台魔法机器可以通过投入x(x可以为0)个魔法币产生更多的魔法币。
魔法机器1:如果投入x个魔法币,魔法机器会将其变为2x+1个魔法币
魔法机器2:如果投入x个魔法币,魔法机器会将其变为2x+2个魔法币
小易采购魔法神器总共需要n个魔法币,所以小易只能通过两台魔法机器产生恰好n个魔法币,小易需要你帮他设计一个投入方案使他最后恰好拥有n个魔法币。
输入包括一行,包括一个正整数n(1 ≤ n ≤ 10^9),表示小易需要的魔法币数量。
输出一个字符串,每个字符表示该次小易选取投入的魔法机器。其中只包含字符'1'和'2'。
10
122
num = [] n = int(input(">>>")) while n != 0: if n%2 == 0: n = (n - 2)/2 num.append("2") else: n = (n - 1)/2 num.append('1') list = num[::-1] b = ''.join(list) print(b)不知道哪里错了,求解还有输入检查因为偷懒没写,只写了整体思路
# -*- coding: utf-8 -*- import sys class Node(): def __init__(self,Data,left = None,right = None,path = None): self.Data = Data self.left = left self.right = right self.path = path def addchild(self,choice): if choice == 0: self.left = Node(Data = 2*self.Data + 1,path = self.path + '1') if choice == 1: self.right = Node(Data = 2*self.Data + 2,path = self.path + '2') def search(target,tree): if tree.Data == target: path = tree.path return path elif tree.Data > target: return None else: if tree.Data*2 + 1 <= target: tree.addchild(0) path = search(target,tree.left) if path: return path elif tree.Data*2 +2 <= target: tree.addchild(1) path = search(target,tree.right) if path: return path n = int(sys.stdin.readline().strip()) root = Node(0,path='') x = search(target = n,tree = root) print(x)使用DFS回溯的一种解法,内存受限。虽然不如奇数偶数关系明确,但是可以适应多种不同的问题,只要改变公式就可以
Python其实就是一个奇数和偶数的问题。 从输入的数n开始,判断n的奇偶,如果是奇数, 那么前一次肯定是machine 1,否则就是machine 2 递归计算n的前一次的数。。。直到前一个数为0
def magic_machine(x):
Operations = []
def _head_number(x):
if x%2 <1: #偶数
head_x = (x - 2)/2
Operations.append('2')
else:
head_x = (x - 1)/2
Operations.append('1')
if head_x == 0:
return head_x
else:
return _head_number(head_x)
_head_number(x)
Operations.reverse()
return ''.join(Operations)
def main_function():
import sys
for line in sys.stdin:
line = int(line)
output = magic_machine(line)
print(output)
if __name__ == '__main__':
main_function()