题目:hdu6308
地址:http://acm.hdu.edu.cn/showproblem.php?pid=6308
题解:
就是时区转换,难点在读入数据,以及对小数的处理。
思路:
首先是如何如何,特别是后面的UTC那串字符,一开始采用字符串读入的,后来发现还要讨论是否有小数点,以及小数点前面有几位数,还有就是要把字符转换为数字,比较麻烦。
就采用了fscanf(stdin,””,&..)读入,对于后面的数字采用了double类型,可是却发生了两个错误,一开始就是直接用double与int相乘之后再转化为int时,会产生误差,可能是double本身就不是精确的吧,然后打算把double化为int,于是就把double乘上了10,发现还是WA了,后来才明白double是不精确的,比如double temp = 1.0,可能它实际上只有0.99999,所以应该加上+0.1之后,再乘10,最后取整就行。
AC代码:
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
#include<string>
#include<iostream>
#define fo(i,a,b) for(int i = a; i < b; i++)
#define fd(i,a,b) for(int i = a; i > b; i--)
using namespace std;
int T;
int hour,mint;
char s[100];
int main(){
//freopen("in.txt","r",stdin);
//freopen("out1.txt","w",stdout);
scanf("%d",&T);
while(T--){
char ch;
char s[20];
double temp;
int sgn = 1;
fscanf(stdin,"\n%d %d UTC%c%lf",&hour,&mint,&ch,&temp);
if(ch == '-')
sgn = -1;
int c = (int)(temp*10+0.1); ///***从double中提取整数时,记得要加0.1
printf("%d\n",c);
int sum_2 = sgn*c*6 - 8*60;
int sum_1 = hour*60 + mint;
int Total = (sum_1 + sum_2)%(24 * 60);
while(Total < 0) Total += 24*60;
hour = Total/60;
mint = Total%60;
printf("%02d:%02d\n",hour,mint);
}
return 0;
}