题目描述:
实现一个加法器,使其能够输出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
****************************************************************/