# 1001. Problem A+B (Big Integer)

Don’t you know there are languages called Python or Java?

C语言（C班）第二次月考F题题解：
（写的有点笨，将就看吧）

#include <stdio.h>
int main()
{
char a[550], b[550], c, *p1, *p2;
while(scanf("%s %s",a,b)!=EOF)
{
int i, l1=0, l2=0;
p1=a;
p2=b;
while(*p1) {p1++; l1++;}//计算数字长度
while(*p2) {p2++; l2++;}
for(i=0; i<l1/2; i++) {c=a[i]; a[i]=a[l1-i-1]; a[l1-i-1]=c;}//反转数字，模拟列竖式计算加法
for(i=0; i<l2/2; i++) {c=b[i]; b[i]=b[l2-i-1]; b[l2-i-1]=c;}
for(i=l1; i<550; i++) a[i]='0';
for(i=l2; i<550; i++) b[i]='0';
for(i=0; i<540; i++)
{
a[i]+=b[i]-'0';//相加
a[i+1]+=(a[i]-'0')/10;//进位
a[i]=(a[i]-'0')%10+'0';//保留一位数字
}
for(i=540; i>=0; i--) if(a[i]!='0') break;//去除数字前无意义的0
for(; i>=0; i--) printf("%c",a[i]);
printf("\n");
}
return 0;
}


your code is inspiring. it helps me know some of the mistakes that i made.

### include

using namespace std;
class BigInteger{
private:
char str[10050];
int num[10050]={0};
public:
BigInteger(){}
~BigInteger(){}
BigInteger(char *s){
memset(str,'0',sizeof(str));
memset(num,0,sizeof(num));
int len=0;
for(int i=0;;i++){
if(*(s+i)=='\0'){
len=i;break;
}
}
for(int i=0;i<len;i++){
str[i]=*(s+len-i-1);
}
}
int getlen() const{
int len=0;
for(int i=0;i<10050;i++){
if(*(str+i)=='0'){
len=i;break;
}
}
return len;
}
void show() const {
int pos=0;
for(int i=10050;i>=0;i--){
if(num[i]!=0){
pos=i;break;
}
}
for(int i=pos;i>=0;i--) cout<<num[i];
}
BigInteger operator+(const BigInteger &T) const{
BigInteger output;
for(int i=0;i<10050;i++){
if(T.str[i]-'0'+str[i]-'0'+output.num[i]<=9){
output.num[i]+=T.str[i]-'0'+str[i]-'0';
}
else{
output.num[i]+=T.str[i]-'0'+str[i]-'0'-10;
output.num[i+1]++;
}
}
return output;
}
};
int main()
{
char s1[10050],s2[10050];
while(cin>>s1>>s2)
{
cin.get();
BigInteger A(s1),B(s2),C;
C=A+B;
C.show();
cout<<endl;
}
}


### include

using namespace std;

int main()
{
string string1, string2;
while(cin >> string1 >> string2){
string string3;
int maxlength, minlength;
bool oversize = false;

//获得两个数字的长度，并将位数小的数字前面补0
if(string1.length() <= string2.length()){
maxlength = string2.length();
minlength = string1.length();
string1.insert(0, maxlength-minlength, '0');
}
else{
minlength = string2.length();
maxlength = string1.length();
string2.insert(0, maxlength-minlength, '0');
}

for(int j = maxlength-1; j >= 0 ; j--){
stringstream ss1, ss2, ss3, ss4;
int a,b;
string c,d;
ss1 << string1[j];  ss1 >> a;  ss1.clear();
ss2 << string2[j];  ss2 >> b;  ss2.clear();

//如果上一位oversize(和大于10),这一次基础数加1
if(oversize){
a += 1;
oversize = false;
}

ss3 << a+b-10;      ss3 >> c;  ss3.clear();
ss4 << a+b;         ss4 >> d;  ss4.clear();

//如果和大于10，在结果字符串前插入c=a+b-10，并标记此次oversize
if(a + b >= 10){
string3.insert(0, c);
oversize = true;
}else
string3.insert(0, d);

//如果最后一次相加还oversize, 在总和前插入1进位
if(oversize && j == 0) string3.insert(0,1,'1');
}
cout << string3 << endl;


}
return 0;

while True:
try:
a,b=map(int,input().split())
print(a+b)
except:
break

### include

using namespace std;

void plus_all(string,string,int);
int gain(void);

int main(void) {
gain();

return 0;


}

int gain(void) {

string x,y;
int bits_x,bits_y;

if (cin >> x >> y) {

bits_x = x.size(); //x的位数，-2是字符串末尾的"\0"??
bits_y = y.size(); //y的位数

if (bits_y > bits_x) {
while (bits_x < bits_y){
x = "0"+ x;
bits_x++;
}
}
else if (bits_x > bits_y) {
while (bits_x > bits_y){
y = "0"+ y;
bits_y++;
}
}
else {}

plus_all(x,y,bits_x); //计算x,y的和并输出

gain(); //判断是否还有输入

}
//获得2个位数相同的字符串

return 0;


}

void plus_all(string x,string y,int bits_x) {
string res = “”;
int i,num;
int extra = 0;
for (i=bits_x; i>=1; i–) {

    num = int(x[i-1]) + int(y[i-1]) - 48 + extra;

if (num > 57 ){
extra = 1;
res = char(num - 10) + res;
}
else {
extra = 0;
res = char(num) + res;
}

}
cout << res << endl;


}

#include <bits/stdc++.h>

using namespace std;

int main()
{
string a, b;
while(cin >> a >> b)
{
a = '0' + a;
b = '0' + b;
string t;
reverse(a.begin(), a.end());
reverse(b.begin(), b.end());
if(a.size() >= b.size())
{
for(int i = 0; i < b.size(); i++)
{
a[i] = a[i] - '0' + b[i];
if(a[i] > '9')
{
a[i] -= 10;
a[i + 1]++;
}
}
t = a;
}
else
{
for(int i = 0; i < a.size(); i++)
{
b[i] = b[i] - '0' + a[i];
if(b[i] > '9')
{
b[i] -= 10;
b[i + 1]++;
}
}
t = b;
}
for(int i = 0; i < t.size(); i++)
{
if(t[i] > '9')
{
t[i] -= 10;
t[i + 1]++;
}

}
reverse(t.begin(), t.end());
if(t[0] == '0')
t.erase(0, 1);
cout << t << endl;
}
return 0;
}


#include <iostream>
#include <algorithm>
#include <string>
#include <array>
#define MAX_LEN 500
using namespace std;

void stringToint(const string &str, array<int,MAX_LEN> &arr, string::size_type length)
{
auto arr_idx = length - 1;
for (auto i = 0; i < length; ++i)
{
arr[arr_idx] = str[i] - '0';
--arr_idx;
}
}

int main()
{
string a, b;
while (cin >> a >> b)
{
array<int, MAX_LEN> c{}, d{}, e{};
stringToint(a, c, a.size());
stringToint(b, d, b.size());
bool carry = false;
auto upper = max(a.size(), b.size());
for (auto i = 0; i < upper; ++i)
{
e[i] += c[i] + d[i];
if (e[i] >= 10)
{
if (i == upper - 1)
carry = true;
++e[i + 1];
e[i] %= 10;
}
}
if (carry)
cout << "1";
auto iter = e.begin();
while (true)
{
cout << *iter;
if (iter == e.begin())
break;
--iter;
}
cout << endl;
}

return 0;
}


### include

int main()
{
char x[100000],y[100000];
int a,b,c,i,j;
while((scanf(“%s%s”,x,y))!=EOF)
{
int sum[100000]={0};
a=strlen(x);
b=strlen(y);
if(a>b)
{ for(i=0;i=0;i–,j–)
{
sum[j]=x[j]+y[i]-‘0’-‘0’;
}
for(i=a-1;i>=1;i–)
if(sum[i]>=10) {sum[i-1]++;sum[i]-=10;}
for(i=0;i=0;i--,j--) { sum[j]=x[i]+y[j]-'0'-'0'; } for(i=b-1;i>=1;i--) if(sum[i]>=10) {sum[i-1]++;sum[i]-=10;}
for(i=0;i<b;i++)
printf(“%d”,sum[i]);

}
if(a==b)
{
for(i=b-1;i>=0;i--)
{
sum[i]=sum[i]+x[i]+y[i]-'0'-'0';

if(sum[i]>=10&&i!=0)   {sum[i-1]++;sum[i]-=10;}

}
for(i=0;i<a;i++)
printf("%d",sum[i]);


}
printf(“\n”);
}}

### include

int main()
{
int a[510]={0},b[510]={0},i,j,d,e,t,l;
char c[510],f[510];
while(scanf(“%s %s”,c,f)!=EOF)
{
i=0;j=0;
i=strlen(c);
j=strlen(f);
if(i>=j)
{
for(l=0;l<i;l++)
{
a[l+1]=c[l]-‘0’;
}
for(l=0;l<j;l++)
{
b[l+1]=f[l]-‘0’;
}
}
else
{
for(l=0;l<j;l++)
{
a[l+1]=f[l]-‘0’;
}
for(l=0;l=1;j–)
{
a[i]=a[i]+b[j]+d;
d=a[i]/10;
a[i]=a[i]%10;
i–;
}
while(d==1)
{
d=(a[i]+d)/10;
a[i]=(a[i]+d)%10;
i–;
}
if(a[0]==1)
printf(“1”);
for(i=1;i<=e;i++)
printf(“%d”,a[i]);
printf(“\n”);
}
return 0;
}