2966:时区转换

解题思路

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点! (题目的临界点,特殊点值得注意!)

猜你喜欢

转载自blog.csdn.net/u013129143/article/details/83002958