題目:給兩個數字字串 "1234" 與 "4567",對應位數相加 (1+4, 2+5, 3+6, 4+7),結果如何儲存與輸出?
"99" + "1")#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"
ch - '0' 將 '0'~'9' 轉為 0~9。len-1-i。calloc 初始化為 0,大小足夠容納進位。result[i] >= 10 時減 10、高位 +1。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); // 直接輸出或存入字串
}
面試提示:務必與面試官確認「是否進位」、「長度不同時如何對齊」、「結果型態」。