【HDU6308】2018杭电多校训练赛第一场第十一题Time Zone 解题报告

题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=6308

题意:

给一个当前北京时间,输入要去的地方的时区,然后求解去的地方时区对应的时间为多少。

输入:

第一行输入T,表示有测试用例的个数。每个测试用例一行,格式为:a b UTC+X或者其他等等。

输出:

每一个测试用例输出一行,格式为:hh:mm(24小时制)

分析:

先要弄明白输入,我的方法是scanf输入两个整数,接着UTC后输入%c%lf,用一个%c存正负号,用一个%lf直接存时区。

然后要了解一下时区的计算:

已知对应时区的时间 - (已知的区时 - 要去的地方的区时)

也就是:

输出 = 输入 - (8 - 去的地方的区时)

为了方便计算,因为区时有可能是小数,所以我们转成求时间分钟,最后输出再变回24小时制。所以:

输出分钟(最终输出要转化为24小时制) = 输入时间转为分钟 - (区时8 - 要去的地方的区时)*60

但因为时间是小数,所以我们先把去的地方区时乘上10变为整数,方便计算。

注意从浮点数变为整数,浮点数有误差,所以需要多加一个0.1。

AC代码:

#include
#include
#include
using namespace std;

int main()
{
	//freopen("DATA1011.txt","r",stdin);
	int t;
	scanf("%d",&t);
	while(t--)
	{
		int a,b;
		double zone;
		char flag;
		scanf("%d %d UTC%c%lf",&a,&b,&flag,&zone);
		int add = (int)(zone*10+0.1);  // 浮点数的影响,加上一个0.1 
		int sign = (flag=='-')?-1:1;
		// 时区的计算:当前化为分钟的时间-(当前时区-要去的地方时区)*60分钟 
		int nowTime = a*60+b-(8*60-sign*add*6); 
		if(nowTime < 0)
			nowTime += 24*60;
		nowTime %= 24*60;
		printf("%02d:%02d\n",nowTime/60,nowTime%60);
	}
	return 0;
	
}

 

你可能感兴趣的:(2018杭电多校赛)