C++競プロ学習日記(仮)

( 学習記録であり解説Blogではないです )

No.289 数字を全て足そう|yukicoder

No.289 数字を全て足そう - yukicoder を解きました。
私の提出は見苦しいので省略。

この問題は string で受け取った アルファベット + 整数 の文字列の中から
整数部分を取り出して総和を取る問題です。
string →int の変換は std::stoi() しか使った事がなかったのですが...
ASCIIコード(10進数表記)数値変換出来るという事を教えて頂いたので少し学習を...。

まず、ASCIIコード対応表を参照 → ASCII文字コード : IT用語辞典

ASCIIコード(10進数表記)で 0は「48」、1は「49」...
つまり... (string) 1 (49) - (string) 0 (48) = 1 となるので、
この1を int 型に代入stringからint 型への変換が出来るという訳ですか(なるほど)

因みにこの方法を知らなかったので自分でACしたコードでは
文字列からstringを1文字ずつ切り取り、数値判定して、
std::stoi()で数値変換後vectorに入れて総和を取るみたいな事をしていました()

#include <bits/stdc++.h>
using namespace std;
int main(){
    
    cin.tie(0);
    ios::sync_with_stdio(false);
    
    string s;
    cin >> s;
    
    int res{0};
    for(auto &x: s){
        if(isdigit(x)){//数値判定
            res += x - '0';//0はASCIIコードで「48」
        }
    }
    cout << res << endl;
    return 0;
}

↑改善コード
なんて簡素な実装なんだ...(自分でACしたコード、これの3倍は量ある...)
std::stoi() 以外の数値変換法学びです...。

#メモ
2016/05/17より range-based for が少し解ってきた