以下是代码分析:

#include <stdio.h>
int main()
{
int n,i;
int y, mon, d, h, min;

scanf("%d", &n); 
for(i=0;i<n;i++){
  int months[12]={31,31,28,31,30,31,30,31,31,30,31,30};
  scanf("%d.%d.%d %d:%d", &y, &mon, &d, &h, &min); 
  if((y%4==0&&y%100!=0)||y%400==0){
  	months[2]=29;
  }
  else {
  	months[2]=28;
  }
  h+=(min/60);
  min%=60;
  d+=(h/24);
  h%=24;
  while (d>months[mon%12]) {
     d-=months[mon%12];
     mon++;
     }
  y+=(mon/12);
  mon%=12;
  if (mon==0)
  {mon=12;y-=1;}
  if(y<=9999){
     printf("%04d.%02d.%02d %02d:%02d\n", y,mon,d,h,min);
  }
  else {
     printf("%d.%02d.%02d %02d:%02d\n", y,mon,d,h,min);
    }
}
return 0;
}

题目中规定了如果月份超过12个月,应该按照对应1~12月的天数计算,这意味着当月份大于12时,应该将其对12取余,但是代码中并没有这个操作,这是不符合题意的地方。

优化建议:

在代码中添加如下代码,在月份大于12时,对其进行对12取余操作:

mon %= 12;

完整优化后的代码:

#include <stdio.h>
int main()
{
int n,i;
int y, mon, d, h, min;

scanf("%d", &n); 
for(i=0;i<n;i++){
  int months[12]={31,31,28,31,30,31,30,31,31,30,31,30};
  scanf("%d.%d.%d %d:%d", &y, &mon, &d, &h, &min); 
  if((y%4==0&&y%100!=0)||y%400==0){
  	months[2]=29;
  }
  else {
  	months[2]=28;
  }
  h+=(min/60);
  min%=60;
  d+=(h/24);
  h%=24;
  while (d>months[mon%12]) {
     d-=months[mon%12];
     mon++;
     }
  y+=(mon/12);
  mon %= 12; // 添加对12取余操作
  if (mon==0)
  {mon=12;y-=1;}
  if(y<=9999){
     printf("%04d.%02d.%02d %02d:%02d\n", y,mon,d,h,min);
  }
  else {
     printf("%d.%02d.%02d %02d:%02d\n", y,mon,d,h,min);
    }
}
return 0;
}

通过添加 mon %= 12; 这行代码,就能确保月份永远在 1 到 12 之间,从而符合题目要求。

C语言代码优化:时间乱流转换问题分析

原文地址: https://www.cveoy.top/t/topic/lMR6 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录