PCTC竞赛代码运行时错误求助:寻找首个大于n的2的幂次
问题求助:寻找大于n的首个2的幂次代码运行时错误
题目背景
PCTC Sample R2 Q3:输入数字n,输出第一个大于n的2的幂次。示例:输入6,输出8。
我的代码
n = int(input()) i = 1 while n > 0: if 2**i > n: print(2**i) break i += 1
问题情况
提交后得分8/10,仅最后一个测试用例报运行时错误,尝试过改用for循环写法,问题依旧。
问题原因及解决方法
你的代码存在边界情况处理缺失的问题:当输入的n <= 0时,while n > 0的循环条件不成立,代码不会执行任何输出语句,评测系统会因得不到预期输出判定为运行时错误——最后一个测试用例大概率是n=0或负数的情况。
修正方案1:补全边界处理
n = int(input()) if n <= 0: print(1) else: i = 1 while True: power = 2 ** i if power > n: print(power) break i += 1
修正方案2:更高效的位运算写法
利用Python整数的bit_length()方法,一行代码即可完成,同时自动处理所有边界情况:
n = int(input()) print(1 << n.bit_length())
- 原理:对于正整数n,
n.bit_length()返回其二进制表示的位数,比如6(110)的bit_length是3,1 << 3就是8;对于n=0或负数,bit_length()返回0,1 << 0等于1,符合要求(大于0或负数的最小2的幂是1)。
内容的提问来源于stack exchange,提问作者Iffat Humaira
相关产品推荐
相关产品推荐

