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

面向數論計算的無符號大整數類 CUSuperInt

     編輯:關於VC++

類結構設計

class CUSuperInt {
public:
    CUSuperInt(); CUSuperInt(DWORD); CUSuperInt(char*); CUSuperInt(CUSuperInt&);
    virtual ~CUSuperInt();
protected:
    DWORD* pValue;  // 動態數組存儲數值(基數 2^32)
    DWORD len;      // 數組分配長度
    DWORD last;     // 有效長度(≥1)
};

採用動態擴容策略:空間不足時按 2 倍增長。last 標記有效位,避免無效高位運算。

構造函數特性

  • 支援十進制字符串(如 "12345678901")與十六進制(如 "0x123456789abcdef")
  • 允許數字分組:"12345 567890"、"0x123 4567 89ab cdef"

運算符重載

  • 賦值:DWORD、字符串、同類對象
  • 四則運算:+ - * / %,++ --
  • 注意:/= 返回餘數,商存左操作數;/ 僅返回商
  • 比較運算符:返回 bool
  • 輔助:Dobule()(左移乘 2n)、Half()(右移除 2n,捨餘)

輸出轉換

  • ToDecStr():轉十進制字符串
  • ToHexStr():轉十六進制字符串

異常處理

自定義 CMyException 處理除零與越界。越界上限設為 0x1000000 DWORD(約 1.6 億十進制位),超出拋出異常。

核心算法詳解

二進制除法

  1. 預算商長度並擴展、清零
  2. 構建減數表 XX[32] = {x, 2x, 4x, 8x, ...}
  3. 若被除數 < 除數則結束
  4. 按位試商:高位優先,能商 1 則相減、置位,否則試下一位
  5. 迭代至完成

十進制轉換優化

直接反復除 10 效率極低。改用除數 1,000,000,000(109),每次得到 9 位十進制數,大幅減少除法次數。

優化建議

  • 核心運算改用內聯彙編或純彙編(如 memcpy 重寫)
  • 乘法可考慮 Karatsuba 或 FFT 算法
  • 當前代碼大量使用彙編,僅適用 Win32(未涉及段寄存器)

開發環境:VC6.0 + WinMe/XP。源碼附後。

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