
今天按计划刷洛谷的【入门2:分支结构】。本来以为有了昨天的基础会比较顺利,结果做了一大半发现,条件判断嵌套一多,逻辑就容易乱。加上还有些题披着分支结构的外衣,实际在考循环模拟,确实有点费脑子。剩下的几道长题决定战略性放弃,明天再啃。
稍微整理一下今天卡住的几个语法盲区和逻辑坑。
为了偷懒,我想用三元运算符把多分支判断写在一行里。
当时的错误代码思路是这样的:
print(f'{'Underweight'if BMI<18.5 else ... str(BMI)+"\nOverweight"}')
结果直接报了语法错误。仔细排查后发现有两个思维误区。
第一是引号打架。外层和内层都用了单引号,导致 Python 以为字符串提前截断了。
第二是过度依赖 f-string。我以为只要有变量,就必须在最外层套一个 f"{}"。其实三元运算符本身就会计算出一个结果,直接扔进 print 里就行,遇到真正需要拼接变量的那个分支,再单独起一个 f-string。
修正后的写法,逻辑清晰很多,也没有多余的括号和引号包裹:
m, h = map(float, input().split())
bmi = m / (h ** 2)
# 利用多分支天然的排他性,后面的条件不需要再写 bmi >= 18.5
print("Underweight" if bmi < 18.5 else "Normal" if bmi < 24 else f"{bmi:g}\nOverweight")
上面这道肥胖问题的代码里,还藏着一个针对 Python 选手的坑。题目要求输出保留六位有效数字,并且去掉末尾的 0。这其实是照顾 C++ 选手的默认输出规则,如果用 str(bmi) 强转,很难控制位数和末尾的零。
查阅资料后发现 f-string 里面还有一个 :g 的用法。g 代表通用格式,它可以自动处理掉末尾无用的零,并保留有效的数字位数。直接写 f"{bmi:g}" 就完美解决了这个输出限制。
这题算小鱼跨周游泳的总距离。我一开始死磕数学公式,想用除法算出一共过了几个完整的星期,再算剩下几天。结果由于边界条件太多,越写越乱。
换了个思路,对于这种数据量不大的题目,最稳妥的办法是计算机最擅长的暴力模拟。直接写个 for 循环,一天一天地过日子:只要不是周六和周日,里程就加 250。过了周日,星期直接重置回 1。
x, n = map(int, input().split())
total_distance = 0
for _ in range(n):
if x != 6 and x != 7:
total_distance += 250
x += 1
if x == 8:
x = 1
print(total_distance)
这就叫用算力换脑力,算法题有时候不需要刻意去推导高深的数学公式。
排序问题可以用list.sort()来解决,或者也可以用冒泡排序的思想,另外我记得还有一个坑,这个list.sort()是没有返回值的,它直接修改原列表,我有一道题就把他赋值给变量里,导致我怎么跑,都结果错误
冒泡思想:从数组的第一个元素开始,比较相邻的两个数。如果左边的数比右边的数大,就把它们俩互换位置这样两两比较并一直往后走,直到比到最后一个,需要走n-1趟
这道题要用到math.gcd(num1, num2),可以用来求两个数的公约数,因为题目要求要约分,那就要求分子和分母的公约数,另外使用/号,会是浮点数,会有.0,所以约分时分子分母除以公约数时要用//这个整除号
今天脑力耗尽,就先记到这里。