はじめに
アルゴリズムのちょっとしたメモです。自然数の各桁の数を足します。
実施するソース
一般的な書き方
10の余りを計算して1桁目を取得します。その次に10で割って、十の桁を一の桁に移動させます。値がなくなるまで、足し続けます。
int getSumDigit(int value) {
int total = 0;
while (0 < value) {
total += value % 10;
value = (value / 10).floor();
}
return total;
}
- total += value % 10;
value を10で割った余り(つまり、value の1の位の数字)を total に加算しています。 - value = (value / 10).floor();
value を10で割り、小数点以下を切り捨てることで、次の桁の数字に移動しています。.floor() メソッドは、数値を小数点以下で切り捨てるために使用されます。value が0になると、ループは終了します。
Dart特有の書き方
Dartのメソッドを使えば、以下のように一行で書ける。
final sum = value.toString().split('').map(int.parse).reduce((v, e) => v + e);
-
value.toString()
整数 i を文字列に変換します。これにより、各桁の数字にアクセスできます。 -
split(”)
文字列を空文字(”)で分割し、各桁の数字を要素とするリストを生成します。 -
map(int.parse)
リストの各要素(文字列型の各桁の数字)を整数に変換します。int.parse は文字列を整数に変換する関数です。map メソッドはリストの各要素に関数を適用し、新しいリストを生成します。 -
reduce((v, e) => v + e)
リストの要素を結合して単一の値にします。この例では、各桁の数字の合計を求めるために、リストの要素を加算していきます。reduce メソッドは、リストの最初の2つの要素に関数(この場合は (v, e) => v + e)を適用し、その結果と次の要素に関数を適用していくことで、リスト全体を単一の値にまとめます。
まとめ
各桁数を合計する方法を2つ記載しました。
一つはプログラムで汎用的にできる方法、二つ目はDartの標準で一行でできる方法をまとめました。