P8711 [蓝桥杯 2020 省 B1] 整除序列 存疑解决篇 Python
[蓝桥杯 2020 省 B1] 整除序列
题目描述
有一个序列,序列的第一个数是 n n n,后面的每个数是前一个数整除 2 2 2,请输出这个序列中值为正数的项。
输入格式
输入一行包含一个整数 n n n。
输出格式
输出一行,包含多个整数,相邻的整数之间用一个空格分隔,表示答案。
样例 #1
样例输入 #1
20
样例输出 #1
20 10 5 2 1
提示
对于 80 % 80\% 80% 的评测用例, 1 ≤ n ≤ 1 0 9 1\le n\le10^9 1≤n≤109。
对于所有评测用例, 1 ≤ n ≤ 1 0 18 1\le n\le10^{18} 1≤n≤1018。
蓝桥杯 2020 第一轮省赛 B 组 F 题。
正确答案
import math
n = int(input())
s= [n]
while n>1:
n = n//2
s.append(n)
for i in s:
print(i,end = " ")
80分的答案
import math
n = int(input())
s = [n]
while n>1:
n = math.floor(n/2)
s.append(n)
for i in s:
print(i,end = " ")
两者的区别在于对n的计算上,正确答案的计算是n//2。 80的答案 是math.floor(n/2)对n/2向下取整
在效果上,两者是一样的,但不知为什么会有一个错误。
math.floor()在处理非常大的整数时,会遇到精度问题,可能会影响结果。一般的整除计算还是用//比较好。