上次寫了乙個「無符號大整數加法」,是比較容易的,這次實現了完整的大整數的加減法,支援有符號的!不過實現起來感覺不是很順暢,感覺可以優化的地方還很多,先貼一下**,日後再來優化。
另,思路主要是模擬手算的過程,計算方式在注釋裡有說清楚。
// 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...