题目描述:
实现一个加法器,使其能够输出a+b的值。
输入:
输入包括两个数a和b,其中a和b的位数不超过1000位。
输出:
可能有多组测试数据,对于每组数据,
输出a+b的值。
样例输入:
2 6
10000000000000000000 10000000000000000000000000000000
样例输出:
8
10000000000010000000000000000000
思路:
1. 建立结构体,成员函数来初始化、打印。重载运算符。
2. 每个数字拆成四个一组的int数组,对其进行操作。
3. 注意carry进位以及size的问题。
代码:
#include<iostream> #include<stdio.h> #include<cstdio> #include<math.h> #include<string.h> using namespace std; struct BigInteger{ int digit[1001]; int size; void init(){ /*for(int i=0;i<=1000;i++){ digit[i]=0; }*/ memset(digit,0,sizeof(digit)); } void set(char str[]){ int j=0; int c=1; int count=0; init(); for(int i=strlen(str)-1;i>=0;i--){ digit[j]+=(str[i]-'0')*c; count++; c*=10; if(count==4||i==0){ c=1; j++; count=0; } } size=--j; } void ouput(){ for(int i=size;i>=0;i--){ if(i==size) printf("%d",digit[i]); else printf("%04d",digit[i]); //如果不是第一个需要补0 } cout<<endl; } BigInteger operator + (const BigInteger &A) const{ //B+A,灵魂在B BigInteger c; c.init(); int carry=0; c.size=0; for(int i=0;i<=A.size||i<=size;i++){ int temp=A.digit[i]+digit[i]+carry; if(temp>=10000){ carry=temp/10000; temp%=10000; } else carry=0; c.digit[c.size++]=temp; } if(carry!=0){ c.digit[c.size]=carry; } else c.size--; return c; } }a,b,c; int main(){ char str1[1000],str2[1000]; while(cin>>str1>>str2){ a.set(str1); b.set(str2); BigInteger c; c=a+b; c.ouput(); } return 0; } /************************************************************** Problem: 1198 User: WZDCJ0206 Language: C++ Result: Accepted Time:100 ms Memory:1532 kb ****************************************************************/