c语言将24小时转化为12小时制partial accepted

还是PAC了,请大家帮我看看输入什么的时候是错误答案,谢谢了。
编写一个程序,要求用户输入24小时制的时间,然后显示12小时制的时间。

输入描述

输入在一行中给出带有中间的:符号(半角的冒号)的24小时制的时间,如12:34表示12点34分。当小时或分钟数小于10时,均没有前导的零,如5:6表示5点零6分。

提示:在scanf的格式字符串中加入:,让scanf来处理这个冒号。

输出描述

在一行中输出这个时间对应的12小时制的时间,数字部分格式与输入的相同,然后跟上空格,再跟上表示上午的字符串AM或表示下午的字符串PM。如5:6 PM表示下午5点零6分。注意,在英文的习惯中,中午12点被认为是下午,所以24小时制的12:00就是12小时制的12:0 PM;而0点被认为是第二天的时间,所以是0:0 AM。

用例输入 1
21:11
用例输出 1
9:11 PM


#include
int main(){
    int a,b;
    scanf("%d:%d",&a,&b);
    if(a>=0&&a<12) printf("%d:%d AM\n",a,b);
    if(a==12) printf("%d:%d PM\n",a,b);
    if(a>12&&a<24) printf("%d:%d PM\n",a-12,b);
    if(a==24) printf("%d:%d AM\n",a-24,b);
    return 0;
} 

程序有的小问题和修改方式如下,望采纳,有问题再沟通

  • ① 在第5行的 scanf 语句中,使用了 %d 读入时间的小时和分钟。这样做可能会导致程序无法正确读入前导的零,如 05:06 会被识别成 5:6。这样就会导致程序给出错误的答案。
  • ② 程序中的 if 语句是按照小时的范围来判断的,但是输入的时间是24小时制的,所以程序可能会给出错误的答案。例如,当输入的时间为 24:00 时,程序会输出 12:00 PM,但是正确的答案应该是 0:00 AM。

修改方式:

  • 使用 %d:%d 读入时间,而不是 %d 读入小时和分钟。这样就可以保留前导的零,从而保证输入的时间能够被正确识别。
  • 使用 if 语句分别判断时间的小时和分钟,而不是按照小时的范围来判断。这样就可以避免出现上述问题。

修改后的代码

#include <stdio.h>

int main()
{
    int h, m;
    scanf("%d:%d", &h, &m);

    if (h == 0)
        printf("%d:%02d AM\n", 12, m);
    else if (h < 12)
        printf("%d:%02d AM\n", h, m);
    else if (h == 12)
        printf("%d:%02d PM\n", h, m);
    else
        printf("%d:%02d PM\n", h - 12, m);

    return 0;
}