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

C 語言大數加法實現錯誤分析與修正

     編輯:程式設計綜合問答

代碼核心問題

  1. 語法錯誤:函數參數缺少逗號、缺少分號、循環條件不完整
  2. 邏輯錯誤:字符數組與數值混淆、進位處理錯誤、索引越界
  3. 設計缺陷:函數嵌套定義(C 不支持)、未處理負數/小數點對齊

修正版大數加法(整數)

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

#define MAX_LEN 100

// 字符串反轉
void reverse(char *str) {
    int len = strlen(str);
    for (int i = 0; i < len / 2; i++) {
        char tmp = str[i];
        str[i] = str[len - 1 - i];
        str[len - 1 - i] = tmp;
    }
}

// 大數加法:result = num1 + num2
void bigAdd(const char *num1, const char *num2, char *result) {
    char n1[MAX_LEN], n2[MAX_LEN];
    strcpy(n1, num1);
    strcpy(n2, num2);
    
    reverse(n1);
    reverse(n2);
    
    int len1 = strlen(n1);
    int len2 = strlen(n2);
    int maxLen = len1 > len2 ? len1 : len2;
    
    int carry = 0;
    for (int i = 0; i < maxLen || carry; i++) {
        int d1 = i < len1 ? n1[i] - '0' : 0;
        int d2 = i < len2 ? n2[i] - '0' : 0;
        int sum = d1 + d2 + carry;
        result[i] = (sum % 10) + '0';
        carry = sum / 10;
    }
    result[maxLen + (carry ? 1 : 0)] = '\0';
    reverse(result);
}

int main() {
    char a[MAX_LEN], b[MAX_LEN], res[MAX_LEN + 1];
    printf("輸入第一個大整數: ");
    scanf("%s", a);
    printf("輸入第二個大整數: ");
    scanf("%s", b);
    
    bigAdd(a, b, res);
    printf("和: %s\n", res);
    return 0;
}

擴展:支持小數

  1. 分離整數部分與小數部分
  2. 小數部分補齊等長(右側補 0)
  3. 分別加法,處理小數進位到整數
  4. 合併結果,去除尾部多餘 0

關鍵數據結構建議

typedef struct {
    int digits[MAX_LEN];  // 每位存一位數字,低位在前
    int len;              // 有效位數
    int decimalPos;       // 小數點位置(從右向左第幾位)
} BigNum;

學習建議

  • 先實現整數加法,再擴展減法、乘法、除法
  • 參考開源大數庫:GMP、LibTomMath
  • 理解「分治」思想:將大問題分解為單位運算
  • 大量測試邊界:前導零、最大長度、進位鏈、負數
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved