Java公交发车时间查询程序异常:输入2243返回2260而非2300求解
问题原因
- 时间拆分逻辑缺失:输入的2243是「22点43分」的语义化表示,原代码直接将其作为普通整数做取模运算,没有拆分出独立的小时、分钟字段,计算得到的增量直接加在原整数上,自然会出现分钟位到60不进位的问题。
- 分支判断顺序错误:处理分钟进位的
else if分支写在了非整点发班判断的后面,只要当前时间不是刚好赶上发车,就会被第一个if分支拦截,进位逻辑永远不会触发。 - 变量类型不合理:时间是离散的整数值,用
double类型存储输入存在精度溢出的风险,完全没有必要。
修复方案
- 先把输入的四位整数拆分为小时、分钟两个独立字段,比如2243拆为
hour=22、minute=43 - 基于分钟字段计算下一个20分钟倍数的发班分钟数,如果当前分钟刚好是0/20/40,直接使用当前分钟
- 处理分钟进位逻辑:如果计算得到的发班分钟≥60,分钟减60,小时加1,可额外加24小时归0的逻辑处理跨天场景
- 最后将小时、分钟拼接为四位格式输出,分钟不足两位自动补0
修复后代码
import java.util.Scanner; public class Nc3 { public static void main(String[] args) { Scanner input = new Scanner(System.in); System.out.println("Enter time of arrival: "); int arrivalTime = input.nextInt(); // 拆分小时、分钟 int hour = arrivalTime / 100; int minute = arrivalTime % 100; // 计算下一班发班分钟 int nextMinute = ((minute / 20) + 1) * 20; // 刚好赶上当前班次的特殊处理 if (minute % 20 == 0) { nextMinute = minute; } // 处理分钟满60进位 if (nextMinute >= 60) { nextMinute -= 60; hour += 1; // 跨天处理,不需要可以删掉 if (hour >= 24) { hour = 0; } } // 格式化输出 if (nextMinute == minute) { System.out.printf("Now - %d%02d%n", hour, nextMinute); } else { System.out.printf("%d%02d%n", hour, nextMinute); } input.close(); } }
内容的提问来源于stack exchange,提问作者Galz
相关产品推荐
相关产品推荐

