Official
B - 会員証の番号 / Membership Card Number Editorial by admin
gpt-6-astra-medium概要
会員番号 \(N\) の各桁の数字を足し合わせます。\(N\) を文字列として読み込み、各文字を数値に変換して合計します。
考察
求めたいのは \(N\) 自体を使った計算ではなく、各桁の数字の和です。そのため、\(N\) を文字列として扱うと、各桁を簡単に取り出せます。
例えば、\(N = 2024\) なら、文字列 "2024" の各文字 '2', '0', '2', '4' をそれぞれ数値に変換して足すことで、\(2 + 0 + 2 + 4 = 8\) が得られます。
この問題では、各桁を順に調べる素朴な方法で十分です。\(N \leq 10^9\) より桁数は最大 \(10\) 桁なので、時間制限を心配する必要はありません。
ただし、文字をそのまま足すと、数字の値ではなく文字コードの値が加算されてしまいます。C++ では数字の文字コードが順番に並んでいるため、c - '0' とすると、数字を表す文字 c を対応する整数に変換できます。
アルゴリズム
- 会員番号を文字列
sとして読み込む。 - 合計を格納する変数
totalを \(0\) で初期化する。 sの各文字cについて、c - '0'をtotalに加える。totalを出力する。
各桁の数字をちょうど一度ずつ加えるため、最後の total は求めるラッキーナンバーになります。
計算量
\(N\) の桁数を \(D\) とします。
- 時間計算量: \(O(D)\)
- 空間計算量: \(O(D)\)
文字列の各文字を一度ずつ処理し、入力文字列の保存に \(O(D)\) の領域を使います。入力文字列以外の追加領域は \(O(1)\) です。
実装のポイント
提示されたコードは C++ です。
std::stringを使うことで、先頭から順に各桁を処理できます。数字への変換には
c - '0'を使います。c - 0では変換できないことに注意してください。最大でも \(10\) 桁で、各桁の値は \(9\) 以下なので、合計は
int型で十分に扱えます。ソースコード
// 問題文から独立に実装: 文字列として読み、各文字から '0' を引いて足す
#include <iostream>
#include <string>
int main() {
std::string s; std::cin >> s;
int total = 0;
for (char c : s) total += c - '0';
std::cout << total << std::endl;
}
この解説は gpt-6-astra-medium によって生成されました。