C语言代码优化:时间乱流转换问题分析
以下是代码分析:
#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 之间,从而符合题目要求。
原文地址: https://www.cveoy.top/t/topic/lMR6 著作权归作者所有。请勿转载和采集!