語法書 / AA 競程語法書 下冊 / 第十單元 / string 與數字的互相轉換

10.9 string 與數字的互相轉換

「數字」和「字串」是兩個世界:123 能加減乘除,"123" 能取位數、取子字串。標準函式庫提供了雙向的傳送門:

方向 函式 說明
字串 → 數 stoi(s) string to int:stoi("123")123
字串 → 數 stoll(s)stod(s) 同上,回傳 long longdouble
數 → 字串 to_string(x) 整數、浮點數都能轉
#include <iostream>
#include <string>
using namespace std;

int main() {
    string s = "123";
    int x = stoi(s);                       // 字串 → int
    cout << x + 1 << '\n';                 // 這下是真的數字了

    long long big = stoll("9876543210");   // 超過 int 範圍的數:用 stoll
    cout << big << '\n';

    string t = to_string(20260721);        // 數 → 字串
    cout << t.size() << '\n';              // 一秒數出位數
    return 0;
}

執行結果:

124
9876543210
8

把數字當字串處理

這一節真正的殺手級應用是一種思維:不少題目輸入明明是數字,卻當字串處理更好寫——尤其是跟「位數」有關的題目(各位數字和、判斷迴文數、取出某幾位……)。數字世界要靠除以 10、取餘數層層拆解的事,字串世界一個索引就搞定:

#include <iostream>
#include <string>
using namespace std;

int main() {
    string s;
    cin >> s;                          // 把「數字」當字串讀進來
    int sum = 0;
    for (int i = 0; i < (int)s.size(); i++) {
        sum += s[i] - '0';             // 8.2 的老朋友:單一字元用減法
    }
    cout << sum << '\n';               // 各位數字的和
    return 0;
}

執行結果(輸入 20260721):

20

搭配 8.2 做個總整理:單一字元變數值,用減法 s[i] - '0'一整串變數值,用 stoi(s)。兩個工具各有戰場,混搭最強——逐位檢查用前者,需要整體數值時用後者,to_string 再把數字送回字串世界。(用 .size() 數位數只對非負整數成立:to_string(-12)"-12"、長度 3;浮點數轉出來還帶小數點和補零的小數位,別用這招數位數。)

動手試試看:解掉一半一半(把數字的十進位表示切成前後兩半比較——字串世界的主場)和訂閱人數(依位數捨去的近似值,to_stringsubstr 的綜合應用),實際體會「在字串世界處理數字」比硬算快多少。