判断两车是否相遇的代码始终输出No,求排查建议
代码问题排查与修复建议
嘿,我来帮你揪出这段代码总是输出"No"的问题哈!咱们一步步拆解:
核心问题分析
- 循环条件完全搞反了:比如当
v1 > v2时,只有当x1 < x2,car1才有可能追上car2。但你的循环条件是(x1 + v1*i) > (x2 + v2*i)——这意味着只有当car1已经跑到car2前面时才进入循环,这时候根本不可能在循环里找到相遇点,直接跳过循环输出"No"。 - 变量未初始化:代码里的
prime和i没看到初始化语句。如果i默认从0开始,那初始位置相等的情况(i=0)不会被v1≠v2的分支捕获,因为循环条件不满足,直接跳过。 - 代码冗余且变量污染:
v1>v2和v2>v1的分支逻辑几乎重复,而且如果第一个分支执行了i递增,第二个分支会用已经改变的i值,导致逻辑混乱。
更高效的修复思路
其实不用循环这么绕,用数学公式直接计算更准确高效!
两车相遇的核心条件是:存在非负的时间t(t≥0),使得 x1 + v1*t = x2 + v2*t。整理公式后分情况讨论:
- 如果
v1 == v2:- 只有
x1 == x2时,两车一直处于相遇状态 → 输出"Yes" - 否则,速度相同但初始位置不同,永远不会相遇 → 输出"No"
- 只有
- 如果
v1 != v2:- 计算
t = (x2 - x1)/(v1 - v2) - 只要
t ≥ 0,就说明两车会在未来(或当前)相遇;如果t < 0,说明相遇发生在过去,不算数。
- 计算
修复后的代码示例
情况1:允许相遇在任意非负时刻(不需要整数时间步)
public class CarMeetingChecker { public static void main(String[] args) { // 这里可以替换成你需要测试的初始值 int x1 = 0, v1 = 2; int x2 = 5, v2 = 1; String s; if (v1 == v2) { s = (x1 == x2) ? "Yes" : "No"; } else { // 用double计算避免整数除法丢失精度 double t = (double)(x2 - x1) / (v1 - v2); s = (t >= 0) ? "Yes" : "No"; } System.out.println(s); } }
情况2:要求必须在整数时刻相遇(比如i是整数时间步)
public class CarMeetingChecker { public static void main(String[] args) { // 替换成测试值 int x1 = 0, v1 = 3; int x2 = 4, v2 = 1; String s = "No"; if (v1 == v2) { s = (x1 == x2) ? "Yes" : "No"; } else { int numerator = x2 - x1; int denominator = v1 - v2; // 检查是否能整除,且时间t非负 if (numerator % denominator == 0) { int t = numerator / denominator; if (t >= 0) { s = "Yes"; } } } System.out.println(s); } }
为什么原代码总是输出"No"
举个实际例子:假设x1=0, v1=2,x2=5, v2=1,这时候两车应该在t=5时相遇。但原代码的循环条件是x1 + v1*i > x2 + v2*i,初始i=0时,0+0=0 <5+0=5,不满足循环条件,直接跳过循环,prime还是默认的false,所以输出"No"——这就是问题根源!
内容的提问来源于stack exchange,提问作者Eku Najanu
相关产品推荐
相关产品推荐

