小易准备去魔法王国采购魔法神器,购买魔法神器需要使用魔法币,但是小易现在一枚魔法币都没有,但是小易有两台魔法机器可以通过投入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()