题目链接:
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<iostream>
#include<cstdio>
#include<algorithm>
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;
}