C++競プロ学習日記(仮)

( 学習記録であり解説Blogではないです )

ARC023 A - 経過日数|AtCoder

A: 経過日数 - AtCoder Regular Contest 023 | AtCoderを解きました。
問題文に解法そのままの数式が載っていたのですが...
経過日数のコードとか初めて書くので自分で書いてみたかった!
(少し前にちょまどさんがTwitterbot閏年の計算が〜とか言っていたので是非書いてみたかった)
色々な方法がありそうだけど...
yy,mm,ddを普通に(?)カウントしていく感じでコード書きました。

#include<bits/stdc++.h>
using namespace std;
int main(){
    int y,m,d,year{0},month{0},res{0},i{0},j{1};
    cin >> y >> m >> d;
    i=y-1;
    d=d;
    res=i*365;
    while(i!=0){
        if(i%400==0||(i%4==0&&i%100!=0)){year++;}
        i--;
    }
    while(j!=m){
        if(j==4||j==6||j==9||j==11){month+=30;}
        else if(j==2){
            if(y%400==0||(y%4==0&&y%100!=0)){month+=29;}
            else{month+=28;}
        }
        else{month+=31;}
        j++;
    }
    cout << 735369-(res+year+month+d-1) << endl;
    return 0;
}

実は...閏年の算出方法なんて初めて知った。

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

最初if文のネストをしていたのですが、条件演算子で1まとめに出来ると教えて頂いた。
この時コンパイルエラーが出てしまい...

warning: suggest parentheses around '&&' within '||'

どうやら&&を先に評価する為 ( ) で囲う事が必要っぽかった。
というか、そもそも||と&&が条件の中で共存出来る事も初めて知った。

whileの終了条件のi ! = 0も初めて使った!
凄い便利だ...!
(今まではif(i==0){break;}とかしていた)

経過した日をただ加算していくだけなのに結構誤差が出て険しかった。
けど、楽しかった!(おしまい)