給定一個長整數 a,找到與之最接近的 2 的冪次數(即 2^k 形式的數)。若有兩個同樣接近,輸出較大者。
a 的最大 2 的冪次 d = 2^k ≤ a。b = 2d = 2^{k+1}。a - d 和 b - a,輸出差值較小者;相等時輸出較大的 b。#include <stdio.h>
int main() {
long a;
scanf("%ld", &a);
// 找到最大的 2^k <= a
long d = 1;
while (d * 2 <= a) d <<= 1; // d *= 2
long b = d << 1; // 下一個冪次
// 比較距離
if (a - d < b - a)
printf("%ld\n", d);
else
printf("%ld\n", b);
return 0;
}
d <<= 1 高效計算 2 的冪次。a 本身就是 2 的冪次,則 d = a,b = 2a,差值比較會正確選擇 d。k 再用乘法還原,較繞彎;位運算更直觀高效。時間 O(log a),空間 O(1)。