解题思路
1)把时间化成分钟形式
2)计算两个地区的时差,再把时差换算成分钟形式
3)目标地区的时间 等于 输入给的时区时间 + 时差 ,用分钟表示
4)大于1440的就是后一天则需要-1440, 小于0的则为前一天需要+1440. 因为不需要写出具体天数变化,所以只需要简单±
5)换算成标准时间格式
①情况0 1440 为midnight 720为noon
②>720 则为下午 先-720 再 hour为 des_time/60 minutes为des_time%60. <720则直接换算
AC代码
//1440分钟一天 <720上午 >720pm
//时间化成分钟
//计算出两个地区的时间差 分钟表示
// 输入时间+差距时间 <0 1440- %1440 >1440 %1440
//化成标准格式
#include<stdio.h>
#include<string.h>
char zone[32][20] = {"UTC","GMT","BST","IST","WET","WEST",
"CET","CEST","EET","EEST","MSK",
"MSD","AST","ADT","NST","NDT",
"EST","EDT","CST","CDT","MST",
"MDT","PST","PDT","HST","AKST",
"AKDT","AEST","AEDT","ACST","ACDT",
"AWST"};
float m_time[32] = {0,0,1,1,0,1,1,2,2,3,3,4,-4,-3,-3.5,-2.5,-5,-4,-6,-5,-7,
-6,-8,-7,-10,-9,-8,10,11,9.5,10.5,8};
int different(char* timezone1,char* timezone2){
int i=0,j=0;
float dis;
//找到第一个时区位置
while(strcmp(zone[i],timezone1)){
i++;
}
//找到第二个时区的位置
while(strcmp(zone[j],timezone2)){
j++;
}
//计算时差
dis = m_time[j] - m_time[i];
//返回分钟形式
return int(dis*60);
}
int main(){
int n;
scanf("%d",&n);
for(int i=0;i<n;i++){
char time[10],ap[5];
char timezone1[5],timezone2[5];
int hours,minutes;
scanf("%s",time);
switch(time[0]){
case 'n':
hours = 12;
minutes = 0;
break;
case 'm':
hours = 0;
minutes = 0;
break;
default:
sscanf(time,"%d:%d",&hours,&minutes);
hours%=12;//因为12是Pm但是不需要加12
scanf("%s",ap);
if(ap[0]=='p')
hours+=12;
}
// 输入的 时间以分钟表示
int min_time = hours*60+minutes;
scanf("%s%s",timezone1,timezone2);
//计算时差,获得分钟差
int dis = different(timezone1,timezone2);
//计算 要求的地区的分钟时间
int des_time = min_time + dis;
//换算
if(des_time<0)//前一天
des_time += 1440;
else if(des_time>1440)//后一天
des_time -= 1440;
//换算成标准时间
int des_hour,des_minutes;
switch(des_time){
case 0:
printf("midnight\n");
break;
case 1440:
printf("midnight\n");
break;
case 720:
printf("noon\n");
break;
default:
if(des_time>720){
des_time-=720;
des_hour = des_time / 60;
des_minutes= des_time %60;
if(des_hour==0)
printf("12:%02d p.m.\n",des_minutes);
else
printf("%d:%02d p.m.\n",des_hour,des_minutes);
}
else{
des_hour = des_time / 60;
des_minutes= des_time %60;
if(des_hour==0)
printf("12:%02d a.m.\n",des_minutes);
else
printf("%d:%02d a.m.\n",des_hour,des_minutes);
}
}
}
}
总结
1.时区的转换,用中间公共量转换,这里的公共表示就是分钟
2.字符串的格式化读取!
sscanf(time,"%d:%d",&hours,&minutes);
3.这一题对输入的处理,非常的值得学习
4.提交WA了几次,原因是 首先是 读取hour时如果PM都加12,但是12点是pm 但是不需要加12,然后是输出时, des_hour/60之后为0 是 12点! (题目的临界点,特殊点值得注意!)