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

C語言字串數字相加:演算法設計與實作細節

     編輯:C 語言問答

C 語言進階練習:大數字串逐位相加實作

題目:給兩個數字字串 "1234" 與 "4567",對應位數相加 (1+4, 2+5, 3+6, 4+7),結果如何儲存與輸出?

問題釐清

  • 字串長度可能不同 (如 "99" + "1")
  • 逐位相加可能產生進位 (如 9+9=18)
  • 結果儲存方式:整數陣列?新字串?直接輸出?

完整實作:支援任意長度、處理進位、輸出字串

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char* addNumericStrings(const char* a, const char* b) {
    int lenA = strlen(a), lenB = strlen(b);
    int maxLen = (lenA > lenB) ? lenA : lenB;
    int* result = (int*)calloc(maxLen + 2, sizeof(int));  // +1 進位 +1 結尾

    // 從最低位 (字串尾端) 開始相加
    for (int i = 0; i < maxLen; i++) {
        int digitA = (i < lenA) ? a[lenA - 1 - i] - '0' : 0;
        int digitB = (i < lenB) ? b[lenB - 1 - i] - '0' : 0;
        result[i] += digitA + digitB;
        // 處理進位
        if (result[i] >= 10) {
            result[i] -= 10;
            result[i + 1] += 1;
        }
    }
    // 找最高非零位
    int resLen = maxLen + 1;
    while (resLen > 0 && result[resLen - 1] == 0) resLen--;
    if (resLen == 0) resLen = 1;  // 結果為 0

    // 轉為字串
    char* str = (char*)malloc(resLen + 1);
    for (int i = 0; i < resLen; i++) {
        str[i] = result[resLen - 1 - i] + '0';
    }
    str[resLen] = '\0';

    free(result);
    return str;
}

int main() {
    char s1[100], s2[100];
    printf("輸入第一個數字字串: ");
    scanf("%99s", s1);
    printf("輸入第二個數字字串: ");
    scanf("%99s", s2);

    char* sum = addNumericStrings(s1, s2);
    printf("逐位相加結果: %s\n", sum);
    free(sum);
    return 0;
}

執行範例

輸入第一個數字字串: 1234
輸入第二個數字字串: 4567
逐位相加結果: 57911

解析:
  1+4=5
  2+5=7
  3+6=9
  4+7=11  → 寫 1 進 1
  結果: 5 7 9 11 → 字串 "57911"

關鍵技術點

  1. 字元轉數值:ch - '0' 將 '0'~'9' 轉為 0~9。
  2. 反向索引:字串最低位在尾端,索引 len-1-i。
  3. 動態陣列:calloc 初始化為 0,大小足夠容納進位。
  4. 進位處理:result[i] >= 10 時減 10、高位 +1。
  5. 前導零修剪:從高位往低找第一個非零位。
  6. 記憶體管理:malloc/free 成對使用,避免洩漏。

變體:不進位逐位相加 (單純對應位數相加)

若題目意指「不進位,單純將每位相加結果連接」:

// 1+4=5, 2+5=7, 3+6=9, 4+7=11 → "57911"
for (int i = 0; i < maxLen; i++) {
    int d1 = (i < lenA) ? a[lenA-1-i]-'0' : 0;
    int d2 = (i < lenB) ? b[lenB-1-i]-'0' : 0;
    printf("%d", d1+d2);  // 直接輸出或存入字串
}

面試提示:務必與面試官確認「是否進位」、「長度不同時如何對齊」、「結果型態」。

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