1 から N までの合計
このレッスンで分かること
- 累積パターンは「sum を 0 で初期化 → ループで加算 → 最後に return」の 3 ステップです
- 1 から N まで
nを含めて足したいのでi <= nを使います- 最小例は
int sum = 0; for (int i = 1; i <= n; i++) sum += i; return sum;
1 から N までの合計 とは
for ループと累積パターンを使って、1 から N までの整数の合計を計算してみよう。本レッスンでは、1 から N までの合計 の基本から実際の使いどころまでを整理し、現場で迷わず使える形に落とし込みます。
累積パターンで合計を作る
1 から N までの整数を足し合わせる、というのはプログラミングの世界で最も登場回数の多いお題のひとつです。N = 10 なら 1 + 2 + 3 + ... + 10 で答えは 55、N = 100 なら 5050 になります。手計算でやると気が遠くなりますが、Java のループを使えば一瞬で答えが出ます。
「足し算を繰り返して、答えを 1 つの変数に貯めていく」というやり方は、英語で
accumulator pattern(アキュムレータ・パターン / 累積パターン) と呼ばれます。sumという名前の変数に少しずつ加えていくのが定番で、合計だけでなく個数のカウント、最大値の探索、平均の計算など、ありとあらゆる集計処理の土台になります。
このレッスンでは for 文と sum 変数を組み合わせて、累積パターンを体に染み込ませましょう。一度しっかり覚えれば、Python でも JavaScript でも Go でも、同じ考え方がそのまま通用します。
累積パターンとは
累積パターンは、次の 3 ステップでできています。
- 準備 — 結果を貯める変数 (今回は
sum) を0で初期化する - 繰り返し —
iを1からNまで動かしながら、sumにiを足していく - 完成 — ループが終わった時点で、
sumの中身が1 + 2 + ... + Nの答えになっている
図にすると、sum という箱の中身がループ 1 周ごとに少しずつ膨らんでいくイメージです。
N = 4 のときの i と sum の遷移を表でまとめると、次の通りです。
| ステップ | i | sum |
|---|---|---|
| 初期化 | - | 0 |
| 1 周目 | 1 | 1 |
| 2 周目 | 2 | 3 |
| 3 周目 | 3 | 6 |
| 4 周目 | 4 | 10 |
| 返り値 | - | 10 |
大事なのは、sum の値はループの中で どんどん書き換えられている という点です。int sum = 0; で 1 回箱を用意したら、あとは sum = sum + i; で中身を上書きし続けます。これが「変数は名前付きの箱、中身は入れ替えられる」という Java の基本姿勢です。
Java の for 文の文法
まずは for 文の形を確認しておきましょう。
Java
for (int i = 1; i <= n; i++) {
// 繰り返し処理
}カッコの中身は ; で 3 つに区切られていて、それぞれ役割が違います。
int i = 1— ループ変数iを1から開始する (初期化式)i <= n—iがn以下である間ループを続ける (継続条件)i++— 1 周回るたびにiに1を足す (更新式)
累積パターンと組み合わせるときは、継続条件を
i <= nにするのかi < nにするのかが分かれ目です。1からnまで「nを含めて」足したいので、ここはi <= nが正解です。i < nにしてしまうと、最後のnが足されず答えがズレます。
実際に書いてみる
累積パターンを使って合計を作ると、コードはこうなります。
Java
public class Solution {
public static int sumOneToN(int n) {
int sum = 0;
for (int i = 1; i <= n; i++) {
sum = sum + i;
}
return sum;
}
}読み下すと「sum を 0 で用意し、i を 1 から n まで動かしながら sum に i を足し、最後に sum を返す」だけです。sum = sum + i; は短く書きたいときは sum += i; と書いても同じ意味になります。Java や JavaScript で頻出する省略記法なので、見たら同じものだと脳内変換できるようにしておきましょう。
N = 0 のときは、for の継続条件 i <= 0 が最初から false になるので、ループは 1 周も回りません。結果として sum は 0 のままになり、sumOneToN(0) は 0 を返します。「ループに入らないケース」も自然に処理できるのが、累積パターンの心地よいところです。
別解 ─ ガウスの公式
実は、1 から N までの合計には数学的な公式があります。n * (n + 1) / 2 を計算するだけで、ループを回さずに答えが出ます。
Java
public class Solution {
public static int sumOneToN(int n) {
return n * (n + 1) / 2;
}
}19 世紀の数学者カール・フリードリヒ・ガウスが小学生の頃、先生に「
1から100まで足しなさい」と言われたとき、瞬時に5050と答えた逸話で有名な公式です。(1 + 100) + (2 + 99) + ... = 101 × 50 = 5050という対称性に気づいたと言われています。
今回の課題では「累積パターンを身につける」のが目的なので、まずは for 文を使った素直な書き方を写経してみてください。慣れてきたら、公式版に書き換えて結果が同じになることも試してみると面白いです。
よくある間違い
累積パターン初心者がやらかしがちな落とし穴を 3 つ紹介します。
sumを初期化せずに使う —int sum;とだけ書いてsum = sum + i;をやると、Javaのコンパイラに「variable sum might not have been initialized」と怒られます。初期値0を必ず書きましょう- 継続条件を
i < nにしてしまう —i < nだと最後のnが足されません。sumOneToN(10)の答えが55ではなく45になります。<=と<の違いで結果がガラッと変わるので、ループ条件を書いたら頭の中で「iは最後にいくつまで到達するか?」を必ず確認するクセをつけましょう intの桁あふれ (overflow) —nがとても大きい (100000以上など) と、合計がintの最大値約 21 億を超えて、マイナスの数になってしまうことがあります。今回の課題ではnは小さいので気にしなくて OK ですが、本格的な数値計算ではlong型を使うのが安全です
もうひとつ地味に多いのが、ループの中括弧 {} の外で sum += i; を書いてしまうケースです。Java はインデント (見た目の字下げ) ではなく {} でブロックを判定するので、見た目はループの中にあるように見えてもコンパイラ的にはループの外、ということが起こります。エディタの自動整形に頼って、{ } の対応を確認するクセをつけましょう。
エラーが出たらまず「
sumの値はどこで何になっているか?」を一行ずつ追いかけてみてください。
ここまでの要点
累積パターンは「初期化 → 加算 → return」。i <= n を使って n を含める。大きな数を扱うときは long で桁あふれを避ける。
やってみよう
それでは右側のエディタで、Solution.sumOneToN(int n) メソッドを完成させてみましょう。手順は次の通りです。
- メソッドの中で
int sum = 0;と書いて変数を初期化する for (int i = 1; i <= n; i++)のループを書く- ループの中で
sum += i;(またはsum = sum + i;) と書く - ループの後ろで
return sum;と書く - 「実行」ボタンを押して、すべてのテストが緑になるか確認する
動いたら、for 文を while 文に書き換えてみたり、ガウスの公式バージョンに書き換えてみたり、いろいろな書き方で同じ答えになることを試してみてください。「同じ問題を別のやり方で解く」のは、自分の引き出しを増やす最高のトレーニングです。
累積パターンは、これから先のレッスンで何度も登場します。「合計」だけでなく「カウント」「平均」「最大値」「最小値」など、ちょっと書き換えれば集計処理がほぼ全部できるようになります。ここでしっかり手に馴染ませておきましょう。
よくある質問
Q. Java と他言語の文法はどう違いますか?
A. Java は静的型付けで、変数宣言時に型を明示します(int x = 0;)。中括弧でブロックを表し、文末にセミコロンが必要です。Python の動的型付けや JavaScript の柔軟さに慣れていると最初は窮屈ですが、コンパイル時にバグが発見できる安全性がメリットです。
Q. コードが動かないときに最初に見るべき場所は?
A. コンパイルエラーは行番号とエラー種別(cannot find symbol、incompatible types など)が表示されます。実行時例外はスタックトレースの最初の at ... が原因行です。IDE(IntelliJ / VS Code)の警告も丁寧に潰すと、半分のバグは未然に防げます。
Q. Java の習得後に学ぶべき技術は何ですか?
A. 基本構文を抑えたら java-intermediate(コレクション / ジェネリクス / Stream / 例外)に進み、Spring Boot や Web 開発に展開するのが王道です。クラウド時代は Kotlin / Scala への展開も視野に入りますが、まずは Java 標準を固めるのが効率的です。
次のレッスン
次は 九九の段を作る で、for ループと累積パターンを使って、1 から N までの整数の合計を計算してみよう を学びます。
事前確認 — 進む前に次の 3 つができることを確認しましょう。
- 合計 の要点を自分の言葉で説明できる
- このレッスンの最小コード (または操作手順) を見ずに書ける
- 練習問題やクイズで間違えた箇所を読み直して理解した
理解度チェック (30 秒)
Q. 合計 とは何か、1 文で説明してください。
A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。
関連レッスン
要件
- クラス名は
Solution、メソッド名はsumOneToN、引数はint nひとつにすること - メソッドの戻り値の型は
intで、1 + 2 + ... + nの合計を返すこと nが0のときは0を返すこと (ループが 1 周も回らないケースに対応)
入出力例
test-cases.txt
sumOneToN(10) → 55
sumOneToN(1) → 1
sumOneToN(100) → 5050
sumOneToN(0) → 0
sumOneToN(5) → 15