给出2个大整数A,B,计算A+B的结果。
Input
第1行:大数A
第2行:大数B
(A,B的长度 <= 10000 需注意:A B有可能为负数)
Output
输出A + B
Sample Input
68932147586 468711654886
Sample Output
537643802472
思路:写出大数加法的函数和大数减法的函数,然后分情况讨论。
strcmp:两个字符串自左向右逐个字符相比(按ASCII值大小相比较),直到出现不同的字符或遇'\0'为止。这个函数并不会比较字符串长度。
#include<algorithm>
#include<string.h>
#include<stdio.h>
using namespace std;
char A[10010],B[10010],C[10010];
void dsj(char *a,char *b)
{
int lena=strlen(a),lenb=strlen(b);
int lenm=max(lena,lenb);
int M=lenm;
lena--,lenb--,lenm--;
int carry=0;
C[lenm]='/0';
while(lena>=0&&lenb>=0)
{
C[lenm]=a[lena]+b[lenb]-2*'0'+carry;
carry=C[lenm]/10;
C[lenm]%=10;
C[lenm]+='0';
lena--,lenb--,lenm--;
}
while(lena>=0)
{
C[lenm]=a[lena]-'0'+carry;
carry=C[lenm]/10;
C[lenm]%=10;
C[lenm]+='0';
lena--,lenm--;
}
while(lenb>=0)
{
C[lenm]=b[lenb]-'0'+carry;
carry=C[lenm]/10;
C[lenm]%=10;
C[lenm]+='0';
lenb--,lenm--;
}
if(carry)
printf("%d",carry);
for(int i=0; i<M; i++)
printf("%c",C[i]);
printf("\n");
}
void jian(char *a,char *b)
{
int lena=strlen(a),lenb=strlen(b);
int lenm=max(lena,lenb);
int M=lenm;
lena--,lenb--,lenm--;
int carry=0;
C[lenm]='/0';
while(lena>=0&&lenb>=0)
{
if(a[lena]<b[lenb])
{
a[lena]+=10;
a[lena-1]-=1;
}
C[lenm]=a[lena]-b[lenb];
C[lenm]+='0';
lena--,lenb--,lenm--;
}
while(lena>=0)
{
if(a[lena]<'0')
{
a[lena]+=10;
a[lena-1]-=1;
}
C[lenm]=a[lena];
lena--,lenm--;
}
int flag=0;
for(int i=0; i<M; i++)
{
if(flag)
printf("%c",C[i]);
else if(C[i]>'0')
{
printf("%c",C[i]);
flag=1;
}
}
if(flag==0)
{
printf("0");
}
printf("\n");
}
char Q[10010],E[10010];
int cmpp(char *a,char *b)
{
int lena=strlen(a);
int lenb=strlen(b);
if(lena>lenb||(lena==lenb&&strcmp(a,b)>0))
return 1;
return -1;
}
int main()
{
scanf("%s%s",A,B);
int a=strlen(A),b=strlen(B);
for(int i=1; i<a; i++)
Q[i-1]=A[i];
Q[a-1]='\0';
for(int i=1; i<b; i++)
E[i-1]=B[i];
E[b-1]='\0';
if(A[0]=='-'&&B[0]=='-')
{
printf("-");
dsj(Q,E);
}
else if(A[0]=='-')
{
if(cmpp(Q,B)>0)
{
printf("-");
jian(Q,B);
}
else
jian(B,Q);
}
else if(B[0]=='-')
{
if(cmpp(E,A)>0)
{
printf("-");
jian(E,A);
}
else
jian(A,E);
}
else
dsj(A,B);
}