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 を対応する整数に変換できます。

アルゴリズム

  1. 会員番号を文字列 s として読み込む。
  2. 合計を格納する変数 total を \(0\) で初期化する。
  3. s の各文字 c について、c - '0' を total に加える。
  4. 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 によって生成されました。