#18705: 為什麼錯?


ryanyang_1234 (秋霜)

學校 : 臺北市立建國高級中學
編號 : 83267
來源 : [210.71.78.242]
最後登入時間 :
2022-05-02 14:47:39
a263. 日期差幾天 -- 板橋高中練習題 | From: [203.72.178.252] | 發表日期 : 2019-07-30 14:07

#0: 100% WA (line:2)

您的答案為: 538319
正確答案為: 538320.

#include<bits/stdc++.h>
using namespace std;

int main(){
ios::sync_with_stdio(false);
int y,m,d,y2,m2,d2;
while(cin>>y>>m>>d>>y2>>m2>>d2){
int day=d;
switch(m){
case 1:day+=0;break;
case 2:day+=31;break;
case 3:day+=59;break;
case 4:day+=90;break;
case 5:day+=120;break;
case 6:day+=151;break;
case 7:day+=181;break;
case 8:day+=212;break;
case 9:day+=243;break;
case 10:day+=273;break;
case 11:day+=304;break;
case 12:day+=334;break;
}day+=(y-1)*365;
day+=((y-1)/4-(y-1)/100+(y-1)/400);
int day2=d2;
switch(m2){
case 1:day2+=0;break;
case 2:day2+=31;break;
case 3:day2+=59;break;
case 4:day2+=90;break;
case 5:day2+=120;break;
case 6:day2+=151;break;
case 7:day2+=181;break;
case 8:day2+=212;break;
case 9:day2+=243;break;
case 10:day2+=273;break;
case 11:day2+=304;break;
case 12:day2+=334;break;
}day2+=(y2-1)*365;
day2+=((y2-1)/4-(y2-1)/100+(y2-1)/400);
cout<<abs(day-day2)<<"\n";
}
}
為什麼會少1?
 
#18706: Re:為什麼錯?


inversion (「我們所認識的可符香是個像天使的好女孩」之葉林 *Cries...)

學校 : 國立清華大學
編號 : 43537
來源 : [49.159.6.107]
最後登入時間 :
2022-05-28 19:29:12
a263. 日期差幾天 -- 板橋高中練習題 | From: [49.158.83.43] | 發表日期 : 2019-07-30 14:21

給定以下測資:

2020 3 1

2020 1 1

您的程式會輸出:59 ,但實際上的差距是 60 天。

 

因為您的程式沒有考慮到 y1 、 y2 當年是否為閏年而且 m1 、 m2 有沒有超過 2 月。

 

以上。希望有幫助到您。

 

 

題外話:當使用了 ios::sync_with_stdio(false); 時,最好也使用一下 cin.tie(NULL) 喔。

不然光取消 cin 與標準輸出入(scanf)的連結是不夠的。cout 預設在每次 cin 之後會清空緩衝區(這樣會很慢),因此 cin.tie(NULL) 會解除這個狀態。因此 cout 只會在緩衝區滿了之後才將東西輸出。

 

 
#18719: Re:為什麼錯?


ryanyang_1234 (秋霜)

學校 : 臺北市立建國高級中學
編號 : 83267
來源 : [210.71.78.242]
最後登入時間 :
2022-05-02 14:47:39
a263. 日期差幾天 -- 板橋高中練習題 | From: [203.72.178.252] | 發表日期 : 2019-07-31 13:09

給定以下測資:

2020 3 1

2020 1 1

您的程式會輸出:59 ,但實際上的差距是 60 天。

 

因為您的程式沒有考慮到 y1 、 y2 當年是否為閏年而且 m1 、 m2 有沒有超過 2 月。

 

以上。希望有幫助到您。

 

 

題外話:當使用了 ios::sync_with_stdio(false); 時,最好也使用一下 cin.tie(NULL) 喔。

不然光取消 cin 與標準輸出入(scanf)的連結是不夠的。cout 預設在每次 cin 之後會清空緩衝區(這樣會很慢),因此 cin.tie(NULL) 會解除這個狀態。因此 cout 只會在緩衝區滿了之後才將東西輸出。

 

AC了!謝謝


 
ZeroJudge Forum