202209-1-如此编码
问题
思路
- 通过提示中的公式找出如下关系
\begin{array}{l} c_{1}=c_{0} a_{1} \ c_{2}=c_{1} a_{2} \ c_{3}=c_{2} a_{3} \ \ldots \ldots \ b_{1}=\frac{m % c_{1}}{c_{0}} \ b_{2}=\frac{m % c_{2}-c_{0} \times b_{1}}{c_{1}} \ b_{3}=\frac{m % c_{3}-c_{0} \times b_{1}-c_{1} \times b_{2}}{c_{2}}\ \ldots \ldots \ \end{array}
已知a数组,m
- 用一个缓存变量存储-c_{0} \times b_{1}-c_{1} \times b_{2}-…
一个for循环即可求出数字b
实现
- 我的版本-1(不好,用了两个同级for)
n, m = map(int, input().split()) # n道题,编码结果为m
a = [0] + [i for i in map(int , input().split())] # 选项个数列表,从1到n
b = [0 for _ in range(n+1)] # 答案序号列表,从1到n
c = [1] + [0 for _ in range(n)] # c列表,从0到n
for i in range(1,n+1):
c[i] = c[i-1] * a[i]
b[1] = (m % c[1]) / c[0]
temp = 0 # 存储分子负项和
for i in range(2,n+1):
temp = temp + c[i-2] * b[i-1]
b[i] = (m % c[i] - temp) / c[i-1]
print(*[i for i in map(int,b[1:])])
- 我的版本-2
n, m = map(int, input().split()) # n道题,编码结果为m
a = [0] + [i for i in map(int , input().split())] # 选项个数列表,从1到n
b = [0 for _ in range(n+1)] # 答案序号列表,从1到n
c = 1 # 初始c0=1
temp = 0 # 存储分子负项和
for i in range(1,n+1):
b[i] = (m % (c * a[i]) - temp) / c
temp = temp + c * b[i]
c = c * a[i]
print(*[i for i in map(int,b[1:])])
- Hulake_的版本
n, m = map(int, input().split()) # 输入n题目数量和m神秘数字
a = list(map(int, input().split())) # 输入n道选择题的选项数字
b = [] # 设置b数组来存放每道选择题的正确选项
c = 1 # c为c0,初始值为1
tc = 1 # tc为辅助值,即为t的下一个值
temp = 0 # temp为辅助值,为记录除了此次的C*B之前所有C*B的值的和
# 通过循环进行每道题答案的更新
for i in a:
# 将tc的值进行更新为此时c的下一个值
tc = i*c
# 向b数组中添加此时题目的正确选项
b.append((m%tc-temp)//c)
# 更新temp的值
temp += c*b[-1]
# 更新c的值
c = tc
# 输出每道题的正确选项
print(*b)
python中
//
和/
的区别
/
用于执行常规除法,返回一个浮点数结果,即使两个操作数都是整数//
用于执行整数除法,返回一个整数结果,即使其中一个或两个操作数是浮点数