大整數類 實現加減法

2021-07-16 03:30:25 字數 2540 閱讀 9792

上次寫了乙個「無符號大整數加法」,是比較容易的,這次實現了完整的大整數的加減法,支援有符號的!不過實現起來感覺不是很順暢,感覺可以優化的地方還很多,先貼一下**,日後再來優化。

另,思路主要是模擬手算的過程,計算方式在注釋裡有說清楚。

// biginteger.h

#ifndef __big_integer__h__

#define __big_integer__h__

#include

using namespace std;

class biginteger ;

#endif

// biginteger.cpp

#include "biginteger.h"

#include

#include using namespace std;

// 使乙個表示數字的字串對齊到len的長度,方便後續位對位的運算

void biginteger::align(string& str, int len)

// 判斷字元是否是合法的,即是否為數字或+-號

bool biginteger::isokchar(char ch)

// 使得字串str合法化,並返回其正負符號

bool biginteger::strip(string& str)

// 去掉字首多餘的0

while (left <= right && str[left] == '0')

++left;

// 去除字尾裡非法的字元

while (right >= left && !isokchar(str[right]))

--right;

// 如果這個數字是0,那麼應該保留乙個0

if (left > right)

str = "0";

else

if (left != 0 || right != str.size() - 1)

str = str.substr(left, right - left + 1);// 有改變才取子串

return isneg;

}biginteger::biginteger(string str)

: m_data(str), m_isneg(false)

// 比較兩個大整數的絕對值大小

int biginteger::compareabsolutevalue(const biginteger& a, const biginteger& b)

}// 如果最後有借位,說明被減數是小於減數的!

return (borrow == 0) ? 1 : -1;

}// 呼叫這個函式,必須保證:a的絕對值比b的大

biginteger biginteger::subabsolutevalue(const biginteger& a, const biginteger& b)

result[i] += delta;

}// 最後斷言一下:要滿足a的絕對值比b的大

assert(borrow == 0);

return biginteger(result);

}// 直接將兩個數字的絕對值相加

biginteger biginteger::addabsolutevalue(const biginteger& a, const biginteger& b)

// 處理最後的進製

if (toadd > 0)

result.insert(result.begin(), toadd+'0');

return biginteger(result);

}// 大整數加法

biginteger biginteger::add(const biginteger& other) else else

}}// 大整數減法

biginteger biginteger::sub(const biginteger& other) else else

}}// 輸出大整數,包括符號位

ostream& operator << (ostream& out, biginteger& num)

out<< num.m_data;

return

out;

}

// main.cpp

// 不懂規範化的測試是硬傷

#include

#include "biginteger.h"

using

namespace

std;

int main()

objs = main.o biginteger.o

cc = g++

out: $(objs)

$(cc) -o out $(objs)

main.o: main.cpp

biginteger.o: biginteger.h

clean:

rm *.o

out

大整數演算法(加減法)

現將兩個數分別計算出長度,然後用將長度較短的數為界,寫乙個for迴圈,將兩個數從末往前依次相加。這個迴圈結束後,將長度較大的陣列未計入計算的數進行運算 include includeint main 將陣列初始化為0 int l1,l2 l1 strlen a l2 strlen b if l1 l...

大整數(高精度)加減法

第一次寫,涉及大整數加減運算 先來看看加法,主要思想是逐位相加,進製加1 include include using namespace std void add int a,int b string str1,string str2 void print int a 輸出控制,多餘的0不要輸出 i...

整數加減法練習

程式自動產生隨機數 srand 設定種子為系統時間,以保證每次執行程式產生的隨機數有差別 然後使用者輸入結果,程式判斷使用者輸入是否正確 減法運算時要保證隨機產生的a要大於b 用while迴圈判斷,當然前提條件是使用者選擇的為減法運算,這裡只保證式子產生的結果為非負整數 include includ...