2018杭电多校联合比赛第一场 Time Zone----读入以及double运算问题

题目: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

#include

#include

#include

#include

#include

#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;

}

 

你可能感兴趣的:(acm)