1 から N までの合計

生田 陸人
LuaGate エンジニア / 現役エンジニア
編集 LuaGate編集部

このレッスンで分かること

  • 累積パターンは「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 で答えは 55N = 100 なら 5050 になります。手計算でやると気が遠くなりますが、Java のループを使えば一瞬で答えが出ます。

「足し算を繰り返して、答えを 1 つの変数に貯めていく」というやり方は、英語で accumulator pattern (アキュムレータ・パターン / 累積パターン) と呼ばれます。sum という名前の変数に少しずつ加えていくのが定番で、合計だけでなく個数のカウント、最大値の探索、平均の計算など、ありとあらゆる集計処理の土台になります。

このレッスンでは for 文と sum 変数を組み合わせて、累積パターンを体に染み込ませましょう。一度しっかり覚えれば、Python でも JavaScript でも Go でも、同じ考え方がそのまま通用します。

累積パターンとは

累積パターンは、次の 3 ステップでできています。

  • 準備 — 結果を貯める変数 (今回は sum) を 0 で初期化する
  • 繰り返しi1 から N まで動かしながら、sumi を足していく
  • 完成 — ループが終わった時点で、sum の中身が 1 + 2 + ... + N の答えになっている

図にすると、sum という箱の中身がループ 1 周ごとに少しずつ膨らんでいくイメージです。

diagram (will load when visible)

N = 4 のときの isum の遷移を表でまとめると、次の通りです。

ステップisum
初期化-0
1 周目11
2 周目23
3 周目36
4 周目410
返り値-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 — ループ変数 i1 から開始する (初期化式)
  • i <= nin 以下である間ループを続ける (継続条件)
  • i++ — 1 周回るたびに i1 を足す (更新式)

累積パターンと組み合わせるときは、継続条件を 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; } }

読み下すと「sum0 で用意し、i1 から n まで動かしながら sumi を足し、最後に sum を返す」だけです。sum = sum + i; は短く書きたいときは sum += i; と書いても同じ意味になります。Java や JavaScript で頻出する省略記法なので、見たら同じものだと脳内変換できるようにしておきましょう。

N = 0 のときは、for の継続条件 i <= 0 が最初から false になるので、ループは 1 周も回りません。結果として sum0 のままになり、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) メソッドを完成させてみましょう。手順は次の通りです。

  1. メソッドの中で int sum = 0; と書いて変数を初期化する
  2. for (int i = 1; i <= n; i++) のループを書く
  3. ループの中で sum += i; (または sum = sum + i;) と書く
  4. ループの後ろで return sum; と書く
  5. 「実行」ボタンを押して、すべてのテストが緑になるか確認する

動いたら、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 つができることを確認しましょう。

  1. 合計 の要点を自分の言葉で説明できる
  2. このレッスンの最小コード (または操作手順) を見ずに書ける
  3. 練習問題やクイズで間違えた箇所を読み直して理解した

理解度チェック (30 秒)

Q. 合計 とは何か、1 文で説明してください。

この章のポイント

A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。

関連レッスン

要件

  1. クラス名は Solution、メソッド名は sumOneToN、引数は int n ひとつにすること
  2. メソッドの戻り値の型は int で、1 + 2 + ... + n の合計を返すこと
  3. n0 のときは 0 を返すこと (ループが 1 周も回らないケースに対応)

入出力例

test-cases.txt

sumOneToN(10)55 sumOneToN(1)1 sumOneToN(100)5050 sumOneToN(0)0 sumOneToN(5)15

ヒント

main.java
main.java
学習モード

メモ

1 から N までの合計

⌘S で保存