编程初学者求助:计费代码测试用例失败,求排查逻辑问题
问题分析:短途计费代码的错误场景
嘿,作为编程初学者碰到这种「看不到测试用例但代码报错」的情况太正常了,我帮你拆解下你的代码逻辑哪里可能踩坑:
首先先明确你的代码逻辑:
Scanner sc = new Scanner(System.in); int a = sc.nextInt(); // first distance int m = sc.nextInt(); // fare for distance a int n = sc.nextInt(); // fare for remaining distance int d = sc.nextInt(); // total distance int fare = (a*m)+((d-a)*n); System.out.println(fare);
你这段代码默认的计费规则是:前a个单位的里程,每个单位收m元;超过a的部分,每个单位收n元。这个逻辑在d > a的时候是没问题的(比如你给的示例1 2 3 5,计算1*2 + (5-1)*3 = 2+12=14,和输出一致),但在以下场景会直接出错:
错误场景1:总距离d ≤ a的时候
比如测试用例输入是3 10 4 2(意思是前3公里每公里10元,超过部分每公里4元,总里程2公里):
- 你的代码计算结果是:
3*10 + (2-3)*4 = 30 -4 =26 - 但实际正确的计费应该是
2*10=20(按实际里程乘单价),或者如果是「前3公里固定收30元」的规则,那正确结果是30?不管哪种,你的代码结果都不符合预期,这肯定会导致测试用例失败。
为什么会这样?因为当d ≤a时,d-a是负数,你的代码会把这部分负数乘n后加到总费用里,完全违背了计费逻辑——总里程没超过a的时候,根本不该出现「减去费用」的情况。
错误场景2:输入包含非整数里程(如果题目允许的话)
不过看你的代码用了int接收输入,要是题目里的里程可以是小数(比如1.5公里),那你的代码会直接截断小数部分,导致计算错误,但这种情况概率比第一种低,最可能触发测试用例失败的还是第一种场景。
修正建议
你需要先判断总里程d和a的大小关系:
Scanner sc = new Scanner(System.in); int a = sc.nextInt(); int m = sc.nextInt(); int n = sc.nextInt(); int d = sc.nextInt(); int fare; if (d <= a) { // 总里程没超过a,按实际里程乘m(或者如果是固定费用m的话,就直接赋值m) fare = d * m; // 如果是前a公里固定收费,改成 fare = m; } else { fare = a * m + (d - a) * n; } System.out.println(fare);
你需要根据题目里的实际计费规则,确定d<=a时的计算方式——是按实际里程乘单价,还是固定收取前a段的费用。
内容的提问来源于stack exchange,提问作者Oompaloompa
相关产品推荐
相关产品推荐

