题目
Code
-法1
M,N=map(int,input().split())
have=0 #用这个排除可以算出来的情况进入impossible那块
for i in range(M+1):
if 2*i+4*(M-i)==N:
have=1
print(str(i)+' '+str(M-i))
if have==0:
while i == M:
print("IMPOSSIBLE")
i+=1 #跳出循环
代码解析
核心思路是使用一个循环遍历所有可能的情况,然后检查是否存在满足条件的结果。首先接受用户输入的两个数字 M 和 N,并将其转换成整数。
然后使用一个 for 循环遍历 i 从 0 到 M 的所有可能取值,对于每个 i,计算 2i+4(M-i) 的结果,与 N 进行比较。
–>如果相等则输出 i 和 M-i,并将 have 设为 1 表示找到了解决方案。
–>如果没有找到满足条件的解决方案,并且循环结束了,have 仍然为0,那么说明没有找到解决方案,就输出"IMPOSSIBLE"。
在这段代码中,还存在一个问题。在判断 have 是否为 0 的时候是放在了 for 循环内部,这就会导致每次循环都会重置 have 的值。可以将对 have 的判断放在循环之外,确保所有循环结束后再进行判断。见法2的代码优化。
-法2(针对法1的代码优化)
M,N=map(int,input().split())
have=0
for i in range(M+1):
if 2*i+4*(M-i)==N:
have=1
print(str(i)+' '+str(M-i))
break
if have==0:
print("IMPOSSIBLE")
代码解析
- 把have==0的判断放在for循环外,如果遍历完还没有找到可以print的值,那么就说明无解了,就可以直接输出impossible了!
- 还有一点,就是可以在print结果的后面加一行break,只要找到了后面的情况就不用再循环算了
解题思路
这道题没有什么特殊高级的地方,就是用简单的功能循环+条件功能,重点就是你要理好逻辑以及程序的步骤就可以了。
奇技淫巧
- 什么时候才要输出‘IMPOSSIBLE’?怎么设计?
–>可以增加一个have变量,如果已经可以print值了,就把它置1,然后在循环结束后,就不会执行impossible的代码了
本文分析了鸡兔同笼问题的解题代码,包括原始的法1和针对法1的优化法2。核心思路是遍历可能的兔子和鸡组合,通过逻辑判断输出答案或IMPOSSIBLE。优化在于将have=0的判断移到循环外,提高效率。

279





