题目描述:
实现一个加法器,使其能够输出a+b的值。
输入:
输入包括两个数a和b,其中a和b的位数不超过1000位。
输出:
可能有多组测试数据,对于每组数据,输出a+b的值
样例输入:
2 6
1000000000000000000000 10000000000000000000000000000000000000000000
样例输出:
8
100000000000000000000000000000000000000000000
#include <iostream> #include<string.h> #include<cstdio> using namespace std; 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控制每4个字符转换成一个数字存入数组, t临时保存字符转换位数字的中间值, c表示当前位的权重,按1,10,100,1000顺序变化 */ t += (str[i]-'0')*c;//计算这个四位数中当前字符代表的数字,即数字乘以当前位权重 j++;//当前转换字符数增加 c *= 10;//计算下一位权重 if(j == 4 || i == 0){//若已经连续转换四个字符,或者已经达到最后一个字符 digit[size++] = t;//这四个字符代表的四位数存入数组,size移动到下一个数组单元 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,即当前数字不足4位时由0补充 else printf("%d",digit[i]);//若是最高位,则无需输出前导0 } printf(" "); } bigInteger operator + (const bigInteger &A) const {//加法运算符 bigInteger ret;//返回两数相加的结果 ret.init(); int carry = 0;//进位,初始值为0 for(int i=0;i<A.size || i<size;i++){ int temp = A.digit[i]+digit[i]+carry;//计算两个整数当前位以及来自低位的进位和 carry = temp/10000;//计算该位的进位 temp %= 10000;//去除进位部分,取后四位 ret.digit[ret.size++] = temp;//保存该位结果 } if(carry != 0){//计算结束后若最高位有进位 ret.digit[ret.size++]=carry;//保存该进位 } return ret; } }a,b,c; char str1[1002],str2[1002]; int main() { scanf("%s %s",str1,str2); a.set(str1);//两个字符串分别设置两个高精度整数 b.set(str2); c = a+b; c.output();//输出 return 0; }
对于c和c++,要使用结构体保存一个高精度整数:
struct bigInteger{ int digit[1000];//按四位数一个单位保存数值 int size;//下一个我们未使用的数组单元 };