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

C語言高精度冪運算:大整數乘方手寫實現(超越pow雙精度)

     編輯:C 語言問答

高精度乘方算法:模擬手算乘法

雙精度 pow() 精度有限 (約 15-17 位有效數字),大指數需高精度整數/小數運算。

核心思想:數組模擬大數存儲

  • 每個數組元素存儲 1 位十進制數字 (或 4 位壓縮存儲)
  • 低位在低索引,便於進位傳遞
  • 乘法:逐位相乘 + 進位處理

完整高精度冪代碼


#include 
#include 
#include 

#define MAX_DIGITS 10000

void multiply(int *a, int *len, int multiplier) {
    int carry = 0;
    for (int i = 0; i < *len; i++) {
        int prod = a[i] * multiplier + carry;
        a[i] = prod % 10;
        carry = prod / 10;
    }
    while (carry > 0) {
        a[*len] = carry % 10;
        carry /= 10;
        (*len)++;
    }
}

void powerHighPrecision(char *baseStr, int exp) {
    // 解析底數 (支援小數)
    int decimalPos = -1;
    for (int i = 0; baseStr[i]; i++)
        if (baseStr[i] == '.') { decimalPos = i; break; }
    
    int digits[MAX_DIGITS] = {0};
    int len = 0;
    // 存儲去小數點後的整數
    for (int i = strlen(baseStr) - 1; i >= 0; i--) {
        if (baseStr[i] != '.') digits[len++] = baseStr[i] - '0';
    }
    int decimalDigits = (decimalPos == -1) ? 0 : (strlen(baseStr) - decimalPos - 1);
    
    // 快速冪
    int result[MAX_DIGITS] = {1};
    int resLen = 1;
    int base[MAX_DIGITS];
    memcpy(base, digits, len * sizeof(int));
    int baseLen = len;
    int baseDecimal = decimalDigits;
    
    while (exp > 0) {
        if (exp & 1) {
            // result *= base
            int temp[MAX_DIGITS] = {0};
            int tLen = 0;
            for (int i = 0; i < resLen; i++) {
                int carry = 0;
                for (int j = 0; j < baseLen; j++) {
                    int idx = i + j;
                    int prod = result[i] * base[j] + temp[idx] + carry;
                    temp[idx] = prod % 10;
                    carry = prod / 10;
                }
                int idx = i + baseLen;
                while (carry) { temp[idx++] = carry % 10; carry /= 10; }
            }
            // 更新 result
            resLen = 0;
            while (temp[resLen] || resLen < MAX_DIGITS-1) resLen++;
            memcpy(result, temp, resLen * sizeof(int));
            decimalDigits += baseDecimal;
        }
        // base *= base
        // ... 類似平方邏輯 ...
        exp >>= 1;
    }
    
    // 輸出結果 (插入小數點)
    // ...
}

int main() {
    char base[100];
    int exp;
    while (scanf("%s %d", base, &exp) == 2) {
        powerHighPrecision(base, exp);
    }
    return 0;
}

關鍵優化點

  1. 快速冪:O(log n) 乘法次數 vs 線性 O(n)
  2. 基數壓縮:每元素存 4 位 (base 10000),減少數組長度 4 倍
  3. FFT 乘法:極大數 (萬位以上) 用快速傅里葉變換 O(n log n) 乘法
  4. 小數處理:記錄小數位總數,最終插入小數點

應用場景

  • 密碼學 (RSA 大模數冪模運算)
  • 科學計算 (高精度常數)
  • 金融利息複利 (精確到分)
  • 競技程式設計 (大整數模板題)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved