【C#】与えられた整数の各桁の値を取得する方法

今回はたまに出くわす、n桁の整数の各桁の値を取得する方法です。例えば、12345の各桁の足し算を計算せよと言われた時に、1の位の値である5, 10の位である4・・・といった感じに各桁の値を取り出せるようになります。

AtCoderの下記の問題をベースとした記事になりますので、リンクを載せておきます。

atcoder.jp

2通りの方法

文字列化

私がこの方法を知らなかったときは、文字列に変換してやってました。

int i = 12345

string s = i.ToString();
int i1 = int.Parse(s[0].ToString()); // 1
int i2 = int.Parse(s[1].ToString()); // 2
int i3 = int.Parse(s[2].ToString()); // 3
int i4 = int.Parse(s[3].ToString()); // 4
int i5 = int.Parse(s[4].ToString()); // 5

これで、各i1-i5を足せば答えが出せます。ただ、これだと与えられる整数の桁数が決まってないといろいろと厄介なので、もし文字列化する方針で書くなら

int i = 12345
int count = 0;
for (int i = 0; i < s.Length; i++)
{
    count += int.Parse(s[i].ToString());
}
Console.WriteLine(count);

こんな感じかなと。これは出力結果は15になります。

でも、なんかセンスがないなと。string→char→string→intみたいな変換が入るので。

これを別の方法でときます。

商と余りを使った方法

まずは、上記と同じことをやっているコードを載せておきます。

int sum = 0;
int value = 12345;
while (0 < value)
{
    sum += (value % 10); // ①
    value = (value / 10); // ②
}
Console.WriteLine(res);

この①と②がポイントなのですが、①を追ってみましょう。

sum += (12345 % 10) // sum += 5
value = (12345 / 10) // value = 1234

このようになります。つまり、10で割った余りが割られる数の1の位の値になります。そして、次に割られる数を10で割った商に置き換えます。これを繰り返していくと各桁の値を計算することができます。

参考

qiita.com

まとめ

B問題だと結構でるようなので、覚えておいていつでも簡単にかけるようになっておくと良さそう