高精度計算_大整數_加_減_乘_除_int型_模板_基於deque
阿新 • • 發佈:2018-11-09
下面給出的是大整數加, 減, 乘, 除int型的模板:
約定: 下面的模板實現中a, b均為HEX進位制數, 且a[0]為a的最高位
const int HEX = 1e9;//運算採取的進位制 deque<int> operator + (const deque<int> &a, const int b){//a,b均為HEX進位制數,且a[0]為a的最高位 deque<int> res; int carry = 0;//進位值 for(int i = a.size() - 1, tmp; i >= 0; --i) tmp = a[i] + (i == 0) * b + carry, res.push_front(tmp % HEX), carry = tmp / HEX; return carry? res.push_front(1), res: res; } deque<int> operator - (const deque<int> &a, const int b){//返回a - b,要求a >= b deque<int> res; for(int i = a.size() - 1, rent = 0, tmp; i >= 0; --i)//rent:借位標誌 tmp = a[i] - (i == 0) * b - rent, res.push_back(tmp < 0? tmp + HEX: tmp), rent = (tmp < 0? 1: 0); while(res.size() > 1 && !res[0]) res.pop_front();//去除高位多餘0 return res; } deque<int> operator * (const deque<int> &a, const int b){//返回a * b deque<int> res; int carry = 0; for(long long i = a.size() - 1, tmp; i >= 0; --i) tmp = (long long)a[i] * b + carry, res.push_front(tmp % HEX), carry = tmp / HEX; if(carry) res.push_front(carry); while(res.size() > 1 && !res[0]) res.pop_front();//去除高位多餘0 return res; } deque<int> operator / (const deque<int> &a, const int b){//返回a / b deque<int> res; for(long long i = 0, rem = 0, tmp; i < a.size(); ++i) tmp = rem * HEX + a[i], res.push_back(tmp / b), rem = tmp % b; while(res.size() > 1 && !res[0]) res.pop_front(); return res; } void show(const deque<int> &a){//列印num對應的整數值 printf("%d", a[0]); for(int i = 1; i < a.size(); ++i) printf("%09d", a[i]); }
下面的測試程式充分展示了上述模板的使用方法:
//大整數加,減,乘,除1位數(基於deque) #include <cstdio> #include <deque> using namespace std; const int HEX = 1e9;//運算採取的進位制 deque<int> operator + (const deque<int> &a, const int b){//a,b均為HEX進位制數,且a[0]為a的最高位 deque<int> res; int carry = 0;//進位值 for(int i = a.size() - 1, tmp; i >= 0; --i) tmp = a[i] + (i == 0) * b + carry, res.push_front(tmp % HEX), carry = tmp / HEX; return carry? res.push_front(1), res: res; } deque<int> operator - (const deque<int> &a, const int b){//返回a - b,要求a >= b deque<int> res; for(int i = a.size() - 1, rent = 0, tmp; i >= 0; --i)//rent:借位標誌 tmp = a[i] - (i == 0) * b - rent, res.push_back(tmp < 0? tmp + HEX: tmp), rent = (tmp < 0? 1: 0); while(res.size() > 1 && !res[0]) res.pop_front();//去除高位多餘0 return res; } deque<int> operator * (const deque<int> &a, const int b){//返回a * b deque<int> res; int carry = 0; for(long long i = a.size() - 1, tmp; i >= 0; --i) tmp = (long long)a[i] * b + carry, res.push_front(tmp % HEX), carry = tmp / HEX; if(carry) res.push_front(carry); while(res.size() > 1 && !res[0]) res.pop_front();//去除高位多餘0 return res; } deque<int> operator / (const deque<int> &a, const int b){//返回a / b deque<int> res; for(long long i = 0, rem = 0, tmp; i < a.size(); ++i) tmp = rem * HEX + a[i], res.push_back(tmp / b), rem = tmp % b; while(res.size() > 1 && !res[0]) res.pop_front(); return res; } void show(const deque<int> &a){//列印num對應的整數值 printf("%d", a[0]); for(int i = 1; i < a.size(); ++i) printf("%09d", a[i]); } int main(){ deque<int> a(1, 1); for(int i = 1; i <= 20; ++i) a = a * i; printf("Test case 1: a = "), show(a), printf("\n"); for(int i = 1; i <= 20; ++i) a = a / i; printf("Test case 2: a = "), show(a), printf("\n"); printf("Test case 3: a = "), show(a - 1), printf("\n"); printf("Test case 4: a = "), show(a + 99999999), printf("\n"); return 0; }
測試程式執行結果截圖: