2018 hdu 1011/6308 Time Zone 一道水题的学习过程!

这道题的题意是:

以北京时区东八区  UTC+ 8 为标准,给出一个具体时间,转换成相应时区要求的具体时间。

刚看到这道题的时候,感觉非常的简单,

把字符串中的数字提取出来,然后与八进行比较,加减运算,输出就可以了。

但我慢慢的遇到困难,

首先,我如何把字符串中的数字提取出来,对于非常000基础的人还真的蛮难。

我百度了各种答案,使用指针,等各种我看不懂的办法

最终我使用了atof()函数

其实最开始使用的是atoi()函数,一个小时之后才可能发现题目数据要求可以是小数,所以匆忙的学习如何提取字符串中的小数并且进行处理。

百度如下:

 atof()     将字符串转换为双精度浮点型值
 atoi()     将字符串转换为整型值
 atol()     将字符串转换为长整型值
 strtod()   将字符串转换为双精度浮点型值,并报告不能被转换的所有剩余数字
 strtol()   将字符串转换为长整值,并报告不能被转换的所有剩余数字
 strtoul()  将字符串转换为无符号长整型值,并报告不能被转换的所有剩余数字

在格式输出的时候总是,第一组数据是对的,第二组总是会出问题,到现在还不知道是什么原因。

考虑的太少,甚至题目没有给出负数的数据,就没有想到会有负数处理的情况。

到后面越来越乱,心情也焦躁,放弃了这道题。

后来调整了一下,看了大家补题的代码和题解进行学习。

简单知道:#include <bits/stdc++.h>是万能头文件。以及复习了浮点数的精度问题和处理问题。

第一点:对于字符串的提取(非常简单):

scanf("%d %d UTC%lf", &h, &m, &d);

第二点:为什么必须要转化为分钟运算,这个问题我想了很久。空想是想不通的,我必须把用小时做的代码写出来之后才能知道为什么要用分钟做。

这个过程中,我在百度上查了一下小时时区的转化,但是没有找到,很少有国家用小数时区。

最开始我把我的思路写了出来:

           11 11 +8.2
          把8.2转化为整数型,然后减去他的整数型
            8.2-8,在处理他的小数部分,乘以0.2*60=12min
            已知h:m
            则,m=m+12;h=h+(8-8)
             输出h:m
            这样不可以吗

网上思路:

        h = h * 60 + m;
        int c = 0;
        if(d > 0) {
            c = (int)(d * 10 + 0.1);
        } else {
            c = (int)(d * 10 - 0.1);
        }
        c = c * 6 - 80 * 6;
        h += c;
        h %= (24 * 60);
        if(h < 0) h += 24 * 60;
        printf("%02d:%02d\n", h / 60, h % 60)

我最后进行尝试了一下具体数据,发现答案是相同的。

网上思路:
11:11
h=11*60+11=671
h=671+12=683
h%=24*60=683
h:m=11:23

我的思路:
11+12=23
11+(8-8)=11

h:m=11:23

接下来就是具体代码实现了!

具体实现中还是会遇到很多困难,比如需要考虑正负号对结果的影响,比如如果超过24时的处理,这些都是我未知,并且凭空想象不出来的。我不知道从哪里下手去解决它。多测试几组数据吗?我现在都要开始怀疑自己的脑子是不是和别人不一样了?

感觉好多大佬做题的思路就是凭直觉就认为这个是对的,具体的证法他们可能也不知道。但是感觉我自己的直觉都是错的,并且如果不能把思路清楚的整理我就无法完成这个题目。

试着测试各种数据,尝试各种可能性,然后头大,这可能是我被一道水题逼疯的过程。现在据我开始写这道题大概两个半小时。

又突然反应到,自己可能时区都不会算,UTC+8,UTC-8有什么区别呢,是东八区和西八区吗,遇到一个时间又该怎么计算,我又冒出了好多问题,开始百度。查过百度之后,感觉自己不是不会,而是脑子已经转不过来了。但我计划把这道题写完。

#include<stdio.h>
#include<iostream>
using namespace std;
int main()
{
    int T;
    scanf("%d",&T);
    while(T--){
        int h,m;
        double s;
        scanf("%d %d UTC%lf",&h,&m,&s);
        printf("%lf   ",s);
        int c=0;
        c=(int)s;
        printf("%lf   ",c);
        int hh=h+(s-8);
        if(hh<0)h=hh+24;
        c=int ((s-c+0.01)*60);
        printf("%lf   ",c);
        m=m+c;
        if(m<0){h--;m=m+59;}
        printf("%02d:%02d\n",h,m);
     }
     return 0;
}

改了一点,代码大致都是对的,评测是超时,不知道怎么办了。是方法的错误?

猜你喜欢

转载自blog.csdn.net/shahare/article/details/81218110