【C言語】各桁の数字の和を求めるプログラムの書き方

C言語で一つの変数にある数値の各桁の数字の和を計算するプログラムの書き方を解説します。

目次から探す

サンプルコード

int main() {
	int num = 1234;
	int total = 0;
	do
	{
		int temp = num % 10;
		total += temp;
		num /= 10;
	} while (num > 0);

	return total;
}

解説

思ったよりコードが短いと思うかもしれません。

重要なポイントは、4行目~9行目のdo whileループです。

まず6行目のint temp = num % 10;で下一桁の数値を代入しています。

演算子%は、割り算した結果の余りを整数で取得できるので、num % 10を計算すると、必ず下一桁の数字を求められます。

14 % 10 = 1あまり4というように、数字を当てはめるとイメージしやすいはずです

下一桁の数字を7行目のtotal += temp;で加算。これでまずは一桁目の数字だけを加算できました、

次が重要ポイント。

8行目のnum /= 10;で元の数字を10で割ることで下一桁の数字を無くすことができます。

int型変数は小数値が勝手に切り捨てられるので、10で割ると一桁目が小数値になり、計算が完了する際に切り捨てられます。

今回であれば変数numには1234が入っているので、1234÷10は123.4。小数が切り捨てられて計算結果は123になります。

ここまでの計算処理を変数numが0になるまで繰り返すことで、数値の各桁の和を求めることができます。

  1. 1234÷10=123.4→123
  2. 123÷10=12.3→12
  3. 12÷10=1.2→1
  4. 1÷10=0.1→0

このように数字を当てはめてトレースすると、今回のプログラムのアルゴリズムが理解しやすいはずです。

なぜdo while文?

while文でいいのではないかと思うかもしれません。

ですが今回の場合は、変数numは1以上の数値が入っている前提でプログラムを組んでいるため、ループ処理は必ず1回以上行われることになります。

この前提条件によって、ループに入らないという分岐が存在しないため、do while文の練習になるようにと思ってサンプルコードを作成しています。

while文に変更しても正常に動作します

1回以上必ず行う処理がある場合はdo while文。1回もループ処理を行わないケースがあるときはwhile文というように使い分けるといいでしょう。

目次から探す