题目

从标准输入读入一个正整数 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