けんちょんの競プロ精進記録

競プロの精進記録や小ネタを書いていきます

AtCoder ABC 080 B - Harshad Number (7Q, 灰色, 200 点)

整数値の各桁の値の和を求める方法を確認しておこう!

問題概要

整数  X を十進法で表したときの各桁の数字の和が、 X を割り切るとき、 X をハーシャッド数という。

与えられた整数  N がハーシャッド数であるかどうかを判定せよ。

解法

整数  N の各桁の値を求めるには、次のようにすればよいです。


 N が 0 になるまで、次のことを繰り返す

  •  N を 10 で割った余りを求める
  •  N を 10 で割った商に置き換える

たとえば、 N = 5347 のとき、次のようになります。

  •  5347 を 10 で割った余りは 7(一の位の値)
  •  5347 を 10 で割った商に置き換えると  534 になる
  •  534 を 10 で割った余りは 4(十の位の値)
  •  534 を 10 で割った商に置き換えると  53 になる
  •  53 を 10 で割った余りは 3(百の位の値)
  •  53 を 10 で割った商に置き換えると  5 になる
  •  5 を 10 で割った余りは 5(千の位の値)
  •  5 を 10 で割った商に置き換えると  0 になる
  • 0 になったので終了

この手続きを踏むことで、 N = 5347 の各桁の値である 7, 4, 3, 5 を取得できます。あとは、これを足せばよいでしょう。

そして、各桁の和を求めたら、それでもとの整数が割り切れるかどうかを判定しましょう。

コード

#include <bits/stdc++.h>
using namespace std;

int main() {
    int N;
    cin >> N;
    int original_N = N;

    int sum = 0;
    while (N > 0) {
        sum += N % 10;
        N /= 10;
    }

    // 判定する(N の値は変わってしまっているので、予めコピーした値 original_N で判定)
    if (original_N % sum == 0) cout << "Yes" << endl;
    else cout << "No" << endl;
}