每日一题(十六):高精度整数

题目描述:
实现一个加法器,使其能够输出a+b的值。

输入:
输入包括两个数a和b,其中a和b的位数不超过1000位。

输出:
可能有多组测试数据,对于每组数据,
输出a+b的值。

样例输入:
2 6
10000000000000000000 10000000000000000000000000000000
样例输出:
8
10000000000010000000000000000000
 

解题思路

由于该题输入非常巨大,不能使用任何整数类型来直接保存,因此采取高精度整数结构体,以4位为一个单位进行保存,按照从低位开始各对应位相加并加上来自低位的进位从而获取本位的数值以及进位的规则进行运算,具体代码如下: 

#include<stdio.h>
#include<string.h>

struct bigInteger {  //高精度整数结构体
	int digit[1000]; //按四位数一个单位保存数值
	int size;
	void init() {
		for (int i = 0; i < 1000; i++)
			digit[i] = 0;
		size = 0;
	}
	void set(char str[]) {  //从字符串中提取整数
		init();
		int L = strlen(str);
		for (int i = L - 1, j = 0, t = 0, c = 1; i >= 0; i--) {
			//从最后一个字符开始倒序遍历字符串,j控制每四个字符转化为一个数字存入数组
			//t临时保存字符转换为数字的中间值,c表示当前位的权重,按1,10,100,1000顺序变化
			t += (str[i] - '0')*c;
			j++;
			c *= 10;
			if (j == 4 || i == 0) { //若已连续转化四个字符,或者已经到达最后一个字符
				digit[size++] = t;
				j = 0;
				t = 0;
				c = 1;

			}

		}
	}
	void output() { //将该高精度整数输出
		for (int i = size - 1; i >= 0; i--) {
			if (i != size - 1)
				printf("%04d", digit[i]);
			//若当前输出的数字不是最高位数字,用%04的输出前导0
			else printf("%d", digit[i]);
			//若是最高位无需输出前导0
		}
		printf("\n");
	}
	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;
	}	
}a,b,c;

char str1[1002], str2[1002];
int main() {
	while (scanf("%s%s", str1, str2) != EOF) {
		a.set(str1);
		b.set(str2);
		c = a + b;
		c.output();
	}
	return 0;
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值