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???
#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;
}
*補上
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
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
講的真的很詳盡
謝謝大大
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)才對
回應樓上,
(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
回應樓上,
(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
不,我只是回答他而已