#16052: 邏輯問題


kolagh7486 (電腦前的咖啡)

學校 : 國立臺中高級工業職業學校
編號 : 88363
來源 : [1.200.121.142]
最後登入時間 :
2022-09-24 16:06:42
a004. 文文的求婚 | From: [111.246.85.204] | 發表日期 : 2018-11-14 23:39

if(a%400==0||a%4==0&&a%100!=0)

正解

if(a/400==0||a/4==0&&a/100!=0)

答-平年 正解-閏年

if(a%4==0||a%400==0&&a%100!=0)

答-閏年 正解-平年

WHY???

 
#16053: Re:邏輯問題


kolagh7486 (電腦前的咖啡)

學校 : 國立臺中高級工業職業學校
編號 : 88363
來源 : [1.200.121.142]
最後登入時間 :
2022-09-24 16:06:42
a004. 文文的求婚 | From: [111.246.85.204] | 發表日期 : 2018-11-14 23:44

#include <iostream>

using namespace std; 

int a;

int main()

{

  while(cin>>a)

  if(a%400==0||a%4==0&&a%100!=0)

  cout<<"閏年"<<endl; 

  else

  cout<<"平年"<<endl;

}

*補上




 
#16054: Re:邏輯問題


OwO310659 (OwO)

學校 : 新北市立板橋高級中學
編號 : 58647
來源 : [118.150.111.60]
最後登入時間 :
2024-04-12 02:33:19
a004. 文文的求婚 | From: [106.105.27.148] | 發表日期 : 2018-11-15 00:32

1.
在 C++ 中 /運算子 是進行整數除法,
其效果相當於 將除法結果取地板(取下整數) 或者可以理解為 直式除法中的取商 ,
%運算子 則是進行餘數,
兩者的用法並不一樣唷~

判斷一個數是否為另一數的倍數自然是判斷餘數是否為0~
以上就是 if(a/400==0||a/4==0&&a/100!=0) 會錯的原因

2.
提示中有提到「西元年被4整除且不被100整除,或被400整除者即為閏年」,
所以閏年的定義可以理解成「(被4整除 且 不被100整除) 或 (被400整除)」,
→「(被400整除) 或 (被4整除 且 不被100整除)」  (邏輯上 或 有交換律)
至於判斷式可以寫成 (a%400==0||a%4==0&&a%100!=0) 而不用加括號 (a%400==0||(a%4==0&&a%100!=0)) 的原因,
是因為在 C++ 中 &&運算子 的優先度比 ||運算子 還高, (類似先乘除後加減的概念)
所以 a%4==0&&a%100!=0 本身就會先算了就不必加括號了~ (要加也行)

而你最後提到的判斷式 (a%4==0||a%400==0&&a%100!=0) ,
其邏輯上為「(被4整除) 或 (被400整除 且 不被100整除)」,
但由於 (被400整除) 和 (不被100整除) 兩者無法同時成立, (因為是400的倍數也一定會是100的倍數)
所以後項 (被400整除 且 不被100整除) 在邏輯上為 矛盾句(恆假) ,
故「(被4整除) 或 (被400整除 且 不被100整除)」→「(被4整除) 或 False 」→「(被4整除)」,
所以 if(a%4==0||a%400==0&&a%100!=0) 基本上只會判斷「是否被4整除」而已,
與定義不符自然就是錯的了~

以上希望有幫助到你~ OwO

 
#16055: Re:邏輯問題


kolagh7486 (電腦前的咖啡)

學校 : 國立臺中高級工業職業學校
編號 : 88363
來源 : [1.200.121.142]
最後登入時間 :
2022-09-24 16:06:42
a004. 文文的求婚 | From: [180.217.228.208] | 發表日期 : 2018-11-15 06:07

1.
在 C++ 中 /運算子 是進行整數除法,
其效果相當於 將除法結果取地板(取下整數) 或者可以理解為 直式除法中的取商 ,
%運算子 則是進行餘數,
兩者的用法並不一樣唷~

判斷一個數是否為另一數的倍數自然是判斷餘數是否為0~
以上就是 if(a/400==0||a/4==0&&a/100!=0) 會錯的原因

2.
提示中有提到「西元年被4整除且不被100整除,或被400整除者即為閏年」,
所以閏年的定義可以理解成「(被4整除 且 不被100整除) 或 (被400整除)」,
→「(被400整除) 或 (被4整除 且 不被100整除)」  (邏輯上 或 有交換律)
至於判斷式可以寫成 (a%400==0||a%4==0&&a%100!=0) 而不用加括號 (a%400==0||(a%4==0&&a%100!=0)) 的原因,
是因為在 C++ 中 &&運算子 的優先度比 ||運算子 還高, (類似先乘除後加減的概念)
所以 a%4==0&&a%100!=0 本身就會先算了就不必加括號了~ (要加也行)

而你最後提到的判斷式 (a%4==0||a%400==0&&a%100!=0) ,
其邏輯上為「(被4整除) 或 (被400整除 且 不被100整除)」,
但由於 (被400整除) 和 (不被100整除) 兩者無法同時成立, (因為是400的倍數也一定會是100的倍數)
所以後項 (被400整除 且 不被100整除) 在邏輯上為 矛盾句(恆假) ,
故「(被4整除) 或 (被400整除 且 不被100整除)」→「(被4整除) 或 False 」→「(被4整除)」,
所以 if(a%4==0||a%400==0&&a%100!=0) 基本上只會判斷「是否被4整除」而已,
與定義不符自然就是錯的了~

以上希望有幫助到你~ OwO

講的真的很詳盡


謝謝大大

 
#16058: Re:邏輯問題


10555088@mail.hpsh.tp.edu.tw (3.141592653589793238462)

學校 : 不指定學校
編號 : 70904
來源 : [210.71.78.245]
最後登入時間 :
2020-05-04 15:39:14
a004. 文文的求婚 | From: [1.171.177.94] | 發表日期 : 2018-11-15 22:23

1.
在 C++ 中 /運算子 是進行整數除法,
其效果相當於 將除法結果取地板(取下整數) 或者可以理解為 直式除法中的取商 ,
%運算子 則是進行餘數,
兩者的用法並不一樣唷~

判斷一個數是否為另一數的倍數自然是判斷餘數是否為0~
以上就是 if(a/400==0||a/4==0&&a/100!=0) 會錯的原因

2.
提示中有提到「西元年被4整除且不被100整除,或被400整除者即為閏年」,
所以閏年的定義可以理解成「(被4整除 且 不被100整除) 或 (被400整除)」,
→「(被400整除) 或 (被4整除 且 不被100整除)」  (邏輯上 或 有交換律)
至於判斷式可以寫成 (a%400==0||a%4==0&&a%100!=0) 而不用加括號 (a%400==0||(a%4==0&&a%100!=0)) 的原因,
是因為在 C++ 中 &&運算子 的優先度比 ||運算子 還高, (類似先乘除後加減的概念)
所以 a%4==0&&a%100!=0 本身就會先算了就不必加括號了~ (要加也行)

而你最後提到的判斷式 (a%4==0||a%400==0&&a%100!=0) ,
其邏輯上為「(被4整除) 或 (被400整除 且 不被100整除)」,
但由於 (被400整除) 和 (不被100整除) 兩者無法同時成立, (因為是400的倍數也一定會是100的倍數)
所以後項 (被400整除 且 不被100整除) 在邏輯上為 矛盾句(恆假) ,
故「(被4整除) 或 (被400整除 且 不被100整除)」→「(被4整除) 或 False 」→「(被4整除)」,
所以 if(a%4==0||a%400==0&&a%100!=0) 基本上只會判斷「是否被4整除」而已,
與定義不符自然就是錯的了~

以上希望有幫助到你~ OwO

講的真的很詳盡


謝謝大大


正確的應該是(a%4==0&&a%100!=0||a%400==0)才對

 
#16062: Re:邏輯問題


OwO310659 (OwO)

學校 : 新北市立板橋高級中學
編號 : 58647
來源 : [118.150.111.60]
最後登入時間 :
2024-04-12 02:33:19
a004. 文文的求婚 | From: [106.105.27.148] | 發表日期 : 2018-11-16 16:44

回應樓上,

(a%400==0||a%4==0&&a%100!=0) 和 (a%4==0&&a%100!=0||a%400==0) 兩者都是正確的,
我上文有提到說「(邏輯上 或 有交換律)」呀,
就像是「N是偶數 或 N是正整數」和「N是正整數 或 N是偶數」兩者的意思是一樣的,
所以 (a%400==0||a%4==0&&a%100!=0) 和 (a%4==0&&a%100!=0||a%400==0) 其實是一樣的,
(在C++中雖然有短路求值, 但在本題此例中其不影響最終結果)
只是因為樓主提問的是 (a%400==0||a%4==0&&a%100!=0) ,
所以我才轉換成 (a%400==0||a%4==0&&a%100!=0) 的形式來答覆而已~~~  OwO

 
#16090: Re:邏輯問題


10555088@mail.hpsh.tp.edu.tw (3.141592653589793238462)

學校 : 不指定學校
編號 : 70904
來源 : [210.71.78.245]
最後登入時間 :
2020-05-04 15:39:14
a004. 文文的求婚 | From: [1.171.177.94] | 發表日期 : 2018-11-18 16:24

回應樓上,

(a%400==0||a%4==0&&a%100!=0) 和 (a%4==0&&a%100!=0||a%400==0) 兩者都是正確的,
我上文有提到說「(邏輯上 或 有交換律)」呀,
就像是「N是偶數 或 N是正整數」和「N是正整數 或 N是偶數」兩者的意思是一樣的,
所以 (a%400==0||a%4==0&&a%100!=0) 和 (a%4==0&&a%100!=0||a%400==0) 其實是一樣的,
(在C++中雖然有短路求值, 但在本題此例中其不影響最終結果)
只是因為樓主提問的是 (a%400==0||a%4==0&&a%100!=0) ,
所以我才轉換成 (a%400==0||a%4==0&&a%100!=0) 的形式來答覆而已~~~  OwO

不,我只是回答他而已


 
ZeroJudge Forum