欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-04-21 21:09:35
...

 

这道题的题意是:

以北京时区东八区  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;
}

 

 

 

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

 

 

 

相关标签: 初学