這道題的題意是:
以北京時區東八區 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;
}
改了一點,代碼大致都是對的,評測是超時,不知道怎麼辦了。是方法的錯誤?