题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=6308
题目分析:
关键是注意时区的格式和X,Y的取值范围,然后考虑正负,计算出与+8区相差的时间。比较好的思路是直接把小时化成分钟,最后用分钟计算几时几分。因为格式比较简单,可以通过string的长度为5,6,7..进行分布分析,对于X.Y的处理如果用double的话需要考虑精度问题,可以加一个eps然后取整。
#include<iostream>
#include<string>
#include<cstdio>
using namespace std;
int main(void)
{
int n;
cin>>n;
while(n--)
{
int a,b;
string s;
cin>>a>>b>>s;
int sum = a*60+b;
int t = 0;
bool flag1 = false; //记录+ -
bool flag2 = false; //记录 .
if(s[3]=='+'){
flag1 = true;
}
int i = 4;
for(;i<s.length();i++)
{
if(s[i]=='.'){
flag2 = true;
break;
}
else{
t = t*10+(s[i]-'0');
}
}
t*=60;
if(flag2){
t += (s[i+1]-'0')*6;
}
if(flag1){
sum += t - 8*60;
}
else{
sum += -1*t-8*60;
}
if(sum<0){
sum+=60*24;
}
printf("%02d:%02d\n",sum/60%24,sum%60);
}
}
#include <bits/stdc++.h>
#define eps 1e-10
using namespace std;
typedef long long LL;
int main()
{
int t, h, m;
char s[10];
cin>>t;
while(t--)
{
scanf("%d%d%s", &h, &m, s);
h = h*60+m;
int op = s[3]=='+'?1:-1;
double x;
sscanf(s+4, "%lf", &x);
x = (int)(x*10+eps);
int cha = x*6*op-8*60;
h = (h+cha)%(24*60);
if(h < 0) h += 24*60;
printf("%02d:%02d\n", h/60, h%60);
}
return 0;
}