#23445: C++ 用while+if解法與邏輯


piaopiao114@gmail.com (piao)

School : No School
ID : 139225
IP address : [36.230.224.171]
Last Login :
2020-12-02 23:53:12
a005. Eva 的回家作業 -- POJ | From: [36.225.80.213] | Post Date : 2020-11-18 08:33

......原本一直調整測試過不了快把求救文打完,結果把備註打完順便再調整拿去測試就過了。

解法邏輯如下

 

另外,如果把else if(d/c==c/b) 改成 if(d/c==c/b)會得到↓

WA (line:2)

您的答案為: 1 2 3 4 4

正確答案為: 1 2 4 8 16

改成while迴圈內用兩個if判斷,感覺這樣改沒問題,不太明白失敗原因。

------------------------------------------------

#include <iostream>

using namespace std;

 

int main(){

int a,b,c,d,e,t; //宣告變數

cin>>t;  //輸入數列的數目

 

if(0 < t && t <= 20){   //依題目說明列條件,數列的數目在1~20內

  while(t > 0){   //當t>0,迴圈開始

    cin>>a>>b>>c>>d;  //輸入ABCD的數字

    if(d-c==c-b){   //假設公差相同

        e=d+(d-c);   //算出e

        cout<<a<<" "<<b<<" "<<c<<" "<<d<<" "<<e<<endl;   //輸出

        }

   else if(d/c==c/b){   //假設公比相同

        e=d*(d/c);   //算出e

        cout<<a<<" "<<b<<" "<<c<<" "<<d<<" "<<e<<endl;   //輸出

        }

    t=t-1;  //t-1,直到t=0迴圈結束

}  //結束迴圈

}  //結束第一個if

 

return 0;

}

 
#23446: Re:C++ 用while+if解法與邏輯


snakeneedy (蛇~Snake)

School : 國立高雄師範大學附屬高級中學
ID : 7661
IP address : [218.161.41.139]
Last Login :
2020-12-17 11:38:38
a005. Eva 的回家作業 -- POJ | From: [218.161.41.139] | Post Date : 2020-11-18 12:02

請注意:if ... if 和 if ... else if 是不同的流程,if ... if 無論第一個 if 是 T 或 F,第二個 if 都會作判斷;if ... else if 則是當第一個 if 為 F 時,else if 才會作判斷,以這題來說,if ... if 有可能造成一筆測資輸出兩次的錯誤

另外,如果把else if(d/c==c/b) 改成 if(d/c==c/b)會得到↓
WA (line:2)
您的答案為: 1 2 3 4 4
正確答案為: 1 2 4 8 16
改成while迴圈內用兩個if判斷,感覺這樣改沒問題,不太明白失敗原因。

這邊有兩個問題,一是我上述提到的 if 流程,二是整數的除法,3 / 2 會得到 1 而不是 1.54 / 3 也不是 1.333..,會讓你的等比判斷不如預期

只能說還好是先判斷等差,不然改成 if ... else if 還是會拿 WA

 
#23471: Re:C++ 用while+if解法與邏輯


snakeneedy (蛇~Snake)

School : 國立高雄師範大學附屬高級中學
ID : 7661
IP address : [218.161.41.139]
Last Login :
2020-12-17 11:38:38
a005. Eva 的回家作業 -- POJ | From: [218.161.41.139] | Post Date : 2020-11-20 11:03

只能說還好是先判斷等差,不然改成 if ... else if 還是會拿 WA

以數列 1 2 3 4 來說,a=1 b=2 c=3 d=4,若是先判斷等比,寫成

if (d/c == c/b) {
  // 輸出等比數列
} else if (d-c == c-b) {
  // 輸出等差數列
}

會是等比判斷 d/c == c/b 成立,因為 (4/3 → 1) == (3/2 → 1),會輸出錯誤的 1 2 3 4 4 (4*(4/3) → 4),但測資符合限制條件,只是需要判斷成等差

 
#23470: Re:C++ 用while+if解法與邏輯


piaopiao114@gmail.com (piao)

School : No School
ID : 139225
IP address : [36.230.224.171]
Last Login :
2020-12-02 23:53:12
a005. Eva 的回家作業 -- POJ | From: [36.225.80.213] | Post Date : 2020-11-20 02:20

請注意:if ... if 和 if ... else if 是不同的流程,if ... if 無論第一個 if 是 T 或 F,第二個 if 都會作判斷;if ... else if 則是當第一個 if 為 F 時,else if 才會作判斷,以這題來說,if ... if 有可能造成一筆測資輸出兩次的錯誤

另外,如果把else if(d/c==c/b) 改成 if(d/c==c/b)會得到↓
WA (line:2)
您的答案為: 1 2 3 4 4
正確答案為: 1 2 4 8 16
改成while迴圈內用兩個if判斷,感覺這樣改沒問題,不太明白失敗原因。

這邊有兩個問題,一是我上述提到的 if 流程,二是整數的除法,3 / 2 會得到 1 而不是 1.54 / 3 也不是 1.333..,會讓你的等比判斷不如預期

只能說還好是先判斷等差,不然改成 if ... else if 還是會拿 WA

 

 

第一個問題懂了,如果數列是11111之類的數列會同時滿足等差(0)與等比(1)輸出兩次,如果題目中再加入等差也是自然數就可以這樣寫。

第二個問題沒關係,題目中已經有說明「約定數列的前五項均為不大於105的自然數,等比數列的比值也是自然數。」,不會有餘數所以這樣寫沒問題。

 

感謝說明。

 

 
ZeroJudge Forum