【ITニュース解説】🔢 Today I Learned: Counting Digits in Java
2025年09月09日に「Dev.to」が公開したITニュース「🔢 Today I Learned: Counting Digits in Java」について初心者にもわかりやすいように丁寧に解説しています。
ITニュース概要
Javaで、ある数値の中に特定の数字が何回現れるか数える方法を紹介。ループを使い、10で割った余りで桁を取得し比較する方法や、数値を文字列に変換して数える方法など、基本的なアルゴリズムを平易なコードで学べる。(118文字)
ITニュース解説
プログラミング学習において、与えられた数値の中から特定の数字が何回出現するかを数えるという問題は、基本的ながらも重要な概念を多く含んでいる。この問題は、ループ処理や算術演算子の使い方を理解するための優れた実践例となる。ここでは、Java言語を用いてこの問題を解決するための基本的な手法と、その背後にある論理的な仕組みを解説する。
まず、中心となるのは数学的なアプローチである。この方法では、対象となる数値の桁を一つずつ調べていく。例えば、121という数値の中から1という数字が何回出現するかを数える場合を考えてみる。人間であれば、目で見てすぐに2回だとわかるが、プログラムに同じことをさせるには、数値を桁ごとに分解する手順が必要となる。そのために活用されるのが、剰余演算子%と除算演算子/である。
プログラムはまず、ユーザーから対象となる数値N(例:121)と、数えたい数字D(例:1)を入力として受け取る。そして、出現回数を記録するための変数countを0で初期化しておく。処理の核心部分はwhileループで構成される。このループは、対象の数値Nが0より大きい間、繰り返し実行される。
ループの中では、最初にN % 10という計算が行われる。剰余演算子%は、ある数値を別の数値で割ったときの「余り」を求める演算子である。数値を10で割った余りは、その数値の一の位の数字と必ず一致する。例えば、121 % 10の計算結果は1となり、121の一の位の数字を取り出すことができる。この取り出された最後の桁の数字が、探している数字Dと一致するかどうかをif文で判定する。もし一致していれば、count変数の値を1増やす。
次に、N = N / 10という計算が行われる。Javaにおいて整数同士の割り算では、小数点以下は切り捨てられる。そのため、数値を10で割るという操作は、実質的にその数値の一の位を取り除く効果を持つ。例えば、121 / 10の計算結果は12となる。この結果を新しいNとして代入することで、次のループでは12という数値に対して同じ処理を行う準備が整う。
この「最後の桁を取り出して調べる」そして「最後の桁を取り除く」という一連の処理を、Nが0になるまで繰り返す。Nが12のときは、12 % 10で2が取り出され、12 / 10でNは1になる。Nが1のときは、1 % 10で1が取り出され(1とDが一致するのでcountが増える)、1 / 10でNは0になる。Nが0になった時点でwhileループの条件(N > 0)を満たさなくなり、ループは終了する。最終的にcount変数には、数字Dが出現した回数が正確に記録されている。このアプローチは、コンピュータの基本的な数値計算のみで完結するため効率が良く、アルゴリズムの基礎を学ぶ上で非常に重要である。
この問題を解決する方法は一つだけではない。別の有力なアプローチとして、数値を文字列に変換する方法がある。プログラミングでは、あるデータ型で扱いにくい問題も、別のデータ型に変換することで簡単に解決できる場合がある。この場合、数値NをString.valueOf(N)などのメソッドを使って文字列に変換する。例えば、数値の121は文字列の"121"となる。文字列に変換してしまえば、あとは文字列の各文字を先頭から順番に調べていくだけでよい。ループ処理で一文字ずつ取り出し、それが探している数字D(を文字に変換したもの)と一致するかを比較し、一致すればカウントを増やす。この方法は、特にJavaのStream APIのような高機能なライブラリを使うと、非常に簡潔なコードで記述できるという利点がある。ただし、内部的には数値から文字列への変換という処理コストが発生する点も考慮する必要がある。
さらに、再帰(Recursion)という手法を用いることも可能だ。再帰とは、ある関数がその処理の内部で自分自身を呼び出すというテクニックである。この問題に適用する場合、関数の処理として「数値の最後の桁を調べて、探している数字ならカウントに1を加え、残りの桁(数値を10で割ったもの)に対して自分自身を呼び出す」というロジックを組むことができる。再帰は特定の種類の問題を非常にエレガントに記述できる強力な手法だが、処理の流れが直感的でない場合もあり、初心者にとっては少し理解が難しいかもしれない。
これら複数のアプローチが存在することからわかるように、プログラミングにおける問題解決の道筋は一つではない。数学的な演算を駆使する方法、データ型を変換して考える方法など、様々な視点から最適な解法を選択する能力が求められる。初心者にとっては、まずwhileループと算術演算子を使った基本的なアプローチを完全に理解することが第一歩となる。その上で、文字列変換のような異なる発想や、再帰のようなより高度なテクニックにも触れていくことで、問題解決能力の幅は大きく広がっていく。それぞれの方法のメリットとデメリットを理解し、状況に応じて適切な手法を使い分けることが、優れたシステムエンジニアへの道につながるのである。