#18933: 測資時天數爆炸@@?


asd5581284 (mao)

學校 : 國立交通大學
編號 : 100629
來源 : [180.204.76.125]
最後登入時間 :
2019-08-22 10:27:31
a263. 日期差幾天 -- 板橋高中練習題 | From: [180.204.76.125] | 發表日期 : 2019-08-15 10:28

#include <iostream>
using namespace std;

int main()
{
int a, b;
int y, m, d;
int i = 0;

// cout << "Enter the year, month, day: " << endl;
while ( cin >> a >> b >> d )
{

int array[i];

if ( a/4 == 0)
{
y = a*366;
} else {
y = a*365;
}

if ( b==2 || b==4 || b==6 || b==7 || b==9 || b==11 )
{
m = b*31;
}
else if ( b==3 || b==5 || b==8 || b==10 )
{
m = b*30;
}

if ( (a/4 == 0) && (b=1) )
{
m = b*29;
}
else if ( (a/4 != 0) && (b=1) )
{
m = b*28;
}

array[i] = y+m+d;
//cout << "days = " << array[i];
//cout << endl;
i++;

if ( i == 2 )
{
array[i] = array[0] - array[1];
cout << array[i];
break;
}
}
return 0;
}

 
#18943: Re:測資時天數爆炸@@?


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

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

您宣告了

int i = 0;

之後沒有作任何更動就將其作為 array 陣列的大小。

 

直到

array[i] = y+m+d;
//cout << "days = " << array[i];
//cout << endl;
i++;

為止,才有修改 i 的語句。但是卻沒有將其重新初始化。導致 if (i == 2) 只會跑一次,且 array[i] 還不知道要取記憶體的哪個地方(因為宣告有誤,運氣不好會直接噴 Runtime Error)

 

而且 if 判斷式裡有一列 break 指令,會跳出 while 迴圈。但是題目有多筆測試資料,也就是輸入串流裡會有好幾列的數字,而不是只有兩列而已。

因此這個 break 指令是不能用的。

 

還有,您的程式碼若輸入

2012 2 28

2012 2 29

2012 2 29

 

2012 2 28

兩者的結果分別是 -1 和 1 ,然而應為 1 才對。因為題目並無保證兩日期誰先誰後,單純是問兩者的「差距」。

 

此外,您的閏年計算方式有誤,因此日期差會有偏差值。閏年是每 4 年閏一次,但每 100 年則不閏(除了每 400 年,此時需要閏)。

寫成虛擬碼即

(y % 4 == 0 && y % 100 != 0) || y % 400 == 0

 

 

 

以上,希望有幫助到您。

 
ZeroJudge Forum