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

 

 

 

改了一點,代碼大致都是對的,評測是超時,不知道怎麼辦了。是方法的錯誤?

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章