遇到无法用当前数据类型表示的数的时候,利用数组进行处理,按四位数一个单元保存数值
struct bigInteger { //高精度整数结构体
int digit[maxDigits];
int size;
void init() { //初始化
for (int i = 0; i < maxDigits; i++) digit[i] = 0;
size = 0;
}
void set(int x) { //用一个普通整数初始化高精度整数
init();
do {
digit[size++] = x % 10000;
x /= 10000;
} while (x != 0);
}
void output() { //输出
for (int i = size - 1; i >= 0; i--) {
if (i != size - 1) printf("%04d", digit[i]);
else printf("%d", digit[i]);
}
printf("\n");
}
bigInteger operator * (int x) const { //高精度整数与普通整数的乘积
bigInteger ret;
ret.init();
int carry = 0;
for (int i = 0; i < size; i++) {
int tmp = x * digit[i] + carry;
carry = tmp / 10000;
tmp %= 10000;
ret.digit[ret.size++] = tmp;
}
if (carry != 0) {
ret.digit[ret.size++] = carry;
}
return ret;
}
bigInteger operator + (const bigInteger &A) const { //高精度整数之间的加
bigInteger ret;
ret.init();
int carry = 0;
for (int i = 0; i < A.size || i < size; i++) {
int tmp = A.digit[i] + digit[i] + carry;
carry = tmp / 10000;
tmp %= 10000;
ret.digit[ret.size++] = tmp;
}
if (carry != 0) {
ret.digit[ret.size++] = carry;
}
return ret;
}
bigInteger operator / (int x) const { //高精度整数除以普通整数
bigInteger ret; //返回的高精度整数
ret.init(); //返回值初始化
int remainder = 0; //余数
for (int i = size - 1; i >= 0; i--) { //从最高位至最低位依次完成计算
int t = (remainder * 10000 + digit[i]) / x; //计算当前位数值加上高位剩余的余数的和对x求得的商
int r = (remainder * 10000 + digit[i]) % x; //计算当前位数值加上高位剩余的余数的和对x求模后得的余数
ret.digit[i] = t; //保存本位的值
remainder = r; //保存至本位为止的余数
}
ret.size = 0; // 返 回 高 精 度 整 数 的 size 初 始 值 为 0, 即 当 所 有 位 数 字 都 为 0时, digit[0]代表数字0, 作为最高有效位, 高精度整数即为数字0
for (int i = 0; i < maxDigits; i++) {
if (digit[i] != 0) ret.size = i;
} //若存在非0位,确定最高的非0位,作为最高有效位
ret.size++; //最高有效位的下一位即为下一个我们不曾使用的digit数组单元,确定为size的值
return ret;
}
int operator % (int x) const { //高精度整数对普通整数求余数
int remainder = 0; //余数
for (int i = size - 1; i >= 0; i--) {
int t = (remainder * 10000 + digit[i]) / x;
int r = (remainder * 10000 + digit[i]) % x;
remainder = r;
} //过程同高精度整数对普通整数求商
return remainder; //返回余数
}
}a, b, c;
OJ:1198、1076、1080