如何正确计算24小时制通话时长并转换为分钟数?代码问题求助
24小时制通话时长计算错误分析与修复
问题背景
需要基于24小时制格式输入的通话起止时间(如1810代表18点10分),先计算实际通话时长(分钟数),再按以下规则计算最终结果:
- 时长≥120分钟:结果 = 时长 × 0.60(向上取整)
- 60≤时长<120分钟:结果 = 时长 - 40
- 时长<60分钟:结果 = 时长
当前代码存在计算错误:
- 错误案例1:输入
0852(开始)、0906(结束),代码输出54分钟,实际应为14分钟 - 错误案例2:输入
0805(开始)、1210(结束),代码输出243分钟,实际应为245分钟 - 正确案例:输入
0123(开始)、0224(结束),代码输出61分钟(此案例因巧合得到正确结果,但逻辑错误)
错误根源
代码直接将输入的时间整数(如0852、0906)做减法取绝对值,这完全不符合时间计算逻辑:
- 时间整数的数值和实际分钟数并非线性对应,
0852实际是8×60+52=532分钟,0906是9×60+6=546分钟,正确差值是14分钟,但代码计算的是|852-906|=54,完全偏离实际时长。
修复方案
必须先将输入的时间整数转换为当天的总分钟数,再计算通话时长(需处理跨天情况,如2350到0010的时长为20分钟),最后应用规则计算结果。
修复后的C语言代码
#include <stdio.h> #include <math.h> // 将时间整数(如1810)转换为当天总分钟数 int time_to_minutes(int time) { int hours = time / 100; int minutes = time % 100; return hours * 60 + minutes; } int main() { int startTime, endTime; int startMinutes, endMinutes, duration; int result; printf("\nPLDT Telephone Call Charge\n"); printf("\nStart time\t: "); scanf("%d", &startTime); printf("End time\t: "); scanf("%d", &endTime); // 转换为当天总分钟数 startMinutes = time_to_minutes(startTime); endMinutes = time_to_minutes(endTime); // 计算实际通话时长,处理跨天场景 if (endMinutes >= startMinutes) { duration = endMinutes - startMinutes; } else { // 跨天则加上24小时的总分钟数 duration = (24 * 60 - startMinutes) + endMinutes; } // 按规则计算最终结果 if (duration >= 120) { result = ceil(duration * 0.60); } else if (duration >= 60) { result = duration - 40; } else { result = duration; } printf("Length of call\t: %d minutes\n", result); return 0; }
测试验证
- 测试案例1:开始
0852、结束0906- 转换后:532分钟 vs 546分钟,时长=14分钟,最终输出14分钟(正确)
- 测试案例2:开始
0805、结束1210- 转换后:485分钟 vs 730分钟,时长=245分钟,245×0.6=147,向上取整后输出147分钟(原代码错误输出243,现纠正)
- 测试案例3:开始
0123、结束0224- 转换后:83分钟 vs 144分钟,时长=61分钟,按规则输出61-40=21分钟(若需求为输出实际时长,可直接使用
duration值)
- 转换后:83分钟 vs 144分钟,时长=61分钟,按规则输出61-40=21分钟(若需求为输出实际时长,可直接使用
内容的提问来源于stack exchange,提问作者Eli nefertari
相关产品推荐
相关产品推荐

