过大数据处理

      遇到无法用当前数据类型表示的数的时候,利用数组进行处理,按四位数一个单元保存数值

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值