包括高精度间的加、减、乘,及高精度除低精度,正数高精度模低精度
#include <iostream>
#include <string>
#include <algorithm>
#include <iomanip>
using namespace std;
struct BigInt {
int num[1000];
int len;
bool symbol;
BigInt() {
fill(num, num + 1000, 0);
len = 0;
symbol = true;
}
void set(string str) {
int tmp = 0;
int weight = 1;
if (str[0] == '-') {
symbol = false;
str = str.substr(1);
}
for (int i = str.size() - 1; i >= 0; i--) {
tmp += (str[i] - '0') * weight;
weight *= 10;
if (weight == 10000 || i == 0) {
num[len] = tmp;
tmp = 0;
weight = 1;
len++;
}
}
}
void output() {
if (!symbol && !(len == 1 && num[0] == 0))
cout << '-';
cout << num[len - 1];
for (int i = len - 2; i >= 0; i--) {
cout << setw(4) << setfill('0') << num[i];
}
cout << endl;
}
BigInt operator + (BigInt b) {
BigInt res;
//处理符号
if (!symbol && !b.symbol) {
res.symbol = false;
}
else if (!symbol && b.symbol) {
BigInt ta = *(this);
ta.symbol = true;
return b - ta;
}
else if (symbol && !b.symbol) {
b.symbol = true;
return *(this) - b;
}
//正数运算
int carry = 0;
for (int i = 0; i < len || i < b.len; i++) {
int tmp = num[i] + b.num[i] + carry;
res.num[i] = tmp % 10000;
carry = tmp / 10000;
res.len++;
}
if (carry) {
res.num[len] = carry;
res.len++;
}
return res;
}
bool operator < (BigInt b) { //正数比较大小
if (len < b.len)
return true;
else if (len == b.len) {
for (int i = len - 1; i >= 0; i--) {
if (num[i] < b.num[i])
return true;
else if (num[i] > b.num[i])
return false;
}
}
return false;
}
BigInt operator - (BigInt b) {
BigInt res;
//处理符号
if (!symbol && !b.symbol) {
BigInt ta = *(this);
ta.symbol = true;
b.symbol = true;
return b - ta;
}
else if (!symbol && b.symbol) {
BigInt ta = *(this);
ta.symbol = true;
BigInt r = ta + b;
r.symbol = false;
return r;
}
else if (symbol && !b.symbol) {
b.symbol = true;
return *(this) + b;
}
//正数运算
BigInt big, small;
if (*(this) < b) { //小数减大数,结果为负,然后转换成大数减小数
big = b;
small = *(this);
res.symbol = false;
}
else {
big = *(this);
small = b;
}
int borrow = 0;
for (int i = 0; i < big.len || i < small.len; i++) {
int tmp = big.num[i] - small.num[i] - borrow;
if (tmp < 0) {
tmp += 10000;
borrow = 1; //借位
}
else
borrow = 0;
res.num[i] = tmp;
res.len++;
}
for (int i = res.len - 1; i > 0; i--) { //删除第一个有效数字前面的0
if (res.num[i] != 0)
break;
res.len--;
}
return res;
}
BigInt operator * (BigInt b) {
BigInt res;
//处理符号
if ((!symbol && b.symbol) || (symbol && !b.symbol))
res.symbol = false;
//四位四位一乘,与一位一位一乘同理
for (int i = 0; i < len; i++) { //用当前大整数的每四位
for(int j = 0; j < b.len; j++) { //去乘b的每四位
int tmp = num[i] * b.num[j] + res.num[i + j];
res.num[i + j] = tmp % 10000; //结果依次往前挪位
res.num[i + j + 1] += tmp / 10000;
}
}
res.len = len + b.len; //乘法结果最长长度为两数长度相加, 置为最长后去0
for (int i = res.len - 1; i > 0; i--) {
if (res.num[i] != 0)
break;
res.len--;
}
return res;
}
BigInt operator / (int b) { //高精度 / 低精度
BigInt res;
//处理符号
bool bsymbol = true;
if (b < 0) {
bsymbol = false;
b = -b;
}
if ((!symbol && bsymbol) || (symbol && !bsymbol))
res.symbol = false;
//四位四位一除,与一位一位一除同理
int r = 0;
for (int i = len - 1; i >= 0; i--) {
int tmp = r * 10000 + num[i];
res.num[i] = tmp / b;
r = tmp % b;
}
res.len = len;
for (int i = res.len - 1; i > 0; i--) {
if (res.num[i] != 0)
break;
res.len--;
}
return res;
}
int operator % (int b) { //正数高精度 mod 正数低精度
int r = 0;
for (int i = len - 1; i >= 0; i--)
r = (r * 10000 + num[i]) % b;
return r;
}
};
int main() {
string sa, sb;
while (cin >> sa >> sb) {
BigInt a, b;
a.set(sa);
b.set(sb);
BigInt add = a + b;
BigInt sub = a - b;
BigInt mul = a * b;
BigInt div = a / 5;
int mod = a % 5;
add.output();
sub.output();
mul.output();
div.output();
cout << mod << endl;
}
}
参考
《王道机试指南》