26.1.6.1 たくさんの数

コンピュータの特長は大量のデータを高速に処理できることです.このうち,高速性は繰返しの実行で得られますが,大量のデータも扱えないと話になりません.これをやるのに,変数をいちいち定義していたのではプログラムを書くのが大変です.例として,1年の中の通算日を求めるプログラムを考えましょう.

1年の通算日とは,「1日」を1月1日,「32日」を2月1日と数えるやり方で,「365日」は12月31日となります.ここで簡単のために閏年ではないものとしましょう.まず力ずくでやってみます.求める月日は「二百十日」にします.最終結果は変数mとdに入るようにし,「変な」日数の場合はm=d=0とすることにします.

class YearDay {
 public static void main(String argv[ ]) {
    int n=210; int m, d;
    if (n<=31) {m=1; d=n;}
    else if(n <=31+28){m=2; d=n-31;}
    else if(n <=31+28+31){m=3; d=n-31-28;}
    else if(n <=31+28+31+30){m=4; d=n-31-28-31;}
    else if(n <=31+28+31+30+31){m=5; d=n-31-28-31-30;}
         …
    else if(n <=31+28+31+30+31+30+31+31+30+31+30+31)
             {m=12; d=n-31-28-31-30-31-30-31-31-30-31-30;}
    else{m=0; d=0;}
    System.out.println(n + "=" + m + "月" + d + "日");
 }
}

どうみてもスマートではないですね.大体,同じような計算を何回もやっているのは気に入りません.そこで,nと比較される数(やnから引かれる数)が順々に増えてゆくことに注目して,それまでの月の日数の合計を保持する変数を導入しましょう. 初期値は0で,31, 28, 31, 等々が順々に足されてゆくわけです.