51Nod - 1005 大数加法

给出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);

}

猜你喜欢

转载自blog.csdn.net/weixin_41380961/article/details/81868129