首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

ACM 題目 1003 A+B:帶逗號大整數字符串解析與相加

     編輯:C++ 入門

ACM 題目 1003 A+B:帶逗號大整數字符串解析與相加

輸入兩個整數 A, B,格式為「從個位起每三位加逗號」,如 -234,567,890。範圍 -10^9 < A,B < 10^9,輸出正常整數形式的 A+B。

解題思路

  1. 以字符串讀入,處理符號:若首字符為 '-',標記負號並去除。
  2. 去除逗號,計算純數字位數 numC = len - len/4(每 4 字符含 1 個逗號)。
  3. 逐字符轉數字:sum += (c-'0') * 10^(numC-1),numC--。
  4. 根據符號標記調整正負,兩數相加輸出。

核心處理函數

int parse(char s[14]) { // 最多 14 字符:符號+10位數字+3逗號
    int sum = 0, len = strlen(s), sign = 1, digits = len;
    if (s[0] == '-') { sign = -1; digits--; } // 去除符號
    int numC = digits - digits / 4; // 實際數字位數
    for (int i = 0; i < len; i++) {
        if (s[i] >= '0' && s[i] <= '9') {
            sum += (s[i] - '0') * pow(10, numC - 1);
            numC--;
        }
    }
    return sum * sign;
}

主程序

int main() {
    char a[14], b[14];
    int results[100], cnt = 0;
    while (cin >> a >> b) {
        results[cnt++] = parse(a) + parse(b);
    }
    for (int i = 0; i < cnt; i++) cout << results[i] << endl;
    return 0;
}

注意點

  • pow(10, k) 返回 double,賦值給 int 可能有精度誤差,建議用整數循環累乘或預計算 int p10[10]。
  • 輸入以 EOF 結束,用 while(cin>>a>>b) 自動處理。
  • 題目範圍在 int 內,無需大整數庫。

延伸討論:swap(&a,&b) vs swap(a,b)

若自定義 void swap(int *a, int *b),則 swap(&x, &y) 交換指針指向的值,swap(x, y) 調用 std::swap(引用參數)交換變量本身。兩者語義完全不同,切勿混淆。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved