見出し画像

AtCoder Beginner Contest 176を見直すB - Multiple of 9

問題

入力される数字が9の倍数かどうかを判定する問題、ただし入力される数字は最大20万桁。
また、入力される数字が9の倍数であることと、入力される数字を十進法で表したときの各桁の数の和が9の倍数であることは同値という特徴が問題文に示されています。

当日提出したコード

n = str(input())
sum = 0
for i in n:
   sum += int(i)
print('Yes' if sum%9 == 0 else 'No')

CPPで挑戦していたんですが、どうしても通らず結局Pythonで通しました。桁数が非常に多いので、文字列として入力を受けて一文字ずつ数字にキャストし各桁の数の和を求めています。(Pythonであればintに制限がないので数字として受けても処理できそうですが、それまでCPPで作成していたので、文字列として受けてます。)

通らなかったコード

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

int main() {
   string n;
   cin >> n;
   int sum = 0;
   rep(i, n.length()) sum += (int)n[i];
   if(sum%9 == 0) cout << "Yes" << endl;
   else cout << "No" << endl;
}

Pythonと同じように文字列で受けて、int型にキャストしてます。
サンプルは通ったんですが、本番は半分ぐらい通りませんでした。解説動画をみてわかったんですが、サンプル通ったのは偶然ですし、charをintに足す場合、明示的にキャストする必要はなさそうですね。。。

CPPでChar型(文字列)からint型(整数)に変換する場合は以下のようにする必要があります。

rep(i, n.length()) sum += (n[i]-'0');

どういうことかというと、Char型の'0'などの文字をint型にキャストして表示する以下のコードを実行すると

#include <iostream>
int main() {
   std::cout << int('0') << std::endl;
   std::cout << int('1') << std::endl;
   std::cout << int('2') << std::endl;
   std::cout << int('3') << std::endl;
   std::cout << int('4') << std::endl;
   std::cout << int('5') << std::endl;
}

以下のように出力されるからです。

48
49
50
51
52
53

0が48、1が49と全然表示されている値と違います。これは、Char型の内部表現が整数値だからです。なので例えば、Charの'2'(内部表現整数値:50)からCharの'0'(内部表現整数値:48)を引いてやると、求めたい値、整数値の2が取得できるという寸法です。

間違いなく、どっかで見たことある内容だと思うんですが、完全に忘れてました。。。

この記事が気に入ったらサポートをしてみませんか?