题目
从标准输入读入一个正整数 n,判断它是否为 2 的整数次幂(如 1, 2, 4, 8, 16...)。
输入格式:一行输入一个正整数 n。
输出格式:若是 2 的幂输出 yes,否则输出 no,末尾换行。
数据范围与约定:1 ≤ n ≤ 2×109。
思路与算法
1. 位运算性质 n & (n - 1)
2 的幂在二进制表示下有且仅有一个 1。n - 1 会将最低位的 1 变成 0 且将其更低位全变为 1。二者按位与必为 0:n & (n - 1) == 0。
2. 正数前提
0 不是 2 的幂,因此严谨判断为 n > 0 and (n & (n - 1)) == 0,时间复杂度为 O(1)。
完整程序
h = float(input())
n = int(input())
total = 0.0
cur = h
# 模拟皮球反弹轨迹
for i in range(1, n + 1):
total += cur # 下落路程
cur /= 2.0 # 反弹高度折半
if i < n:
total += cur # 第 n 次落地前只加前 n-1 次上升路程
print(f'{total:.2f} {cur:.2f}')运行示例
输入:
16输出:
yes其它写法
下面每种写法都是完整程序,输入输出格式与正文一致,便于对照。
循环除以 2
程序:
#!/usr/bin/python3
# coding=utf-8
n = int(input())
if n == 0:
print("no")
else:
while n % 2 == 0:
n //= 2
print("yes" if n == 1 else "no")输入:
16输出:
yes