大数加法

基准时间限制:1 秒 空间限制:131072 KB 分值: 0  难度:基础题
 收藏
 关注
给出2个大整数A,B,计算A+B的结果。
Input
第1行:大数A
第2行:大数B
(A,B的长度 <= 10000 需注意:A B有可能为负数)
Output
输出A + B
Input示例
68932147586
468711654886
Output示例
537643802472

上一篇简单版大数加法,但上一篇代码不怎么好。

这个大数加法想了好长时间终于做了出来。。不容易啊。。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
char a[10050],b[10050];
int la,lb,flag=0,temp=0;
bool cmp()
{
    for(int i=la-1;i>=0;i--)
        if(a[i]>b[i])
            return 1;
        else return 0;
}
int fun()
{
    if(la==lb)
    return cmp();
    return la>lb;
}
int main()
{
    memset(a,0,sizeof(a));
    memset(b,0,sizeof(b));
    cin>>a>>b;
    la=strlen(a);
    lb=strlen(b);
    for(int i=0;i<la;i++)
        a[i]-='0';//首先把字符数组变成数组
    for(int i=0;i<lb;i++)
        b[i]-='0';//同上
    reverse(a,a+la);
    reverse(b,b+lb);
    int mas=la>lb?la:lb;
    if(a[la-1]==-3||b[lb-1]==-3)
    {
        if(a[la-1]==b[lb-1])
        {
            a[la-1]=b[lb-1]=0;
            flag=3;//flag记录两数相加的类型(正正,正负,负正,负负)
            la--;
            lb--;
        }
        else
        {
            if(a[la-1]==-3)
            {
                a[--la]=0;
                temp=1;//temp记录一正一负相加时结果的正负
            }
            else if(b[lb-1]==-3)
            {
                b[--lb]=0;
                temp=0;
            }
            if(fun())flag=1;
            else flag=2;
        }
    }
    if(flag==1)
    {
        for(int i=0;i<mas;i++)
            a[i]-=b[i];//一正一负时求取绝对值差值
    }
    else if(flag==2)
    {
        for(int i=0;i<mas;i++)
            a[i]=b[i]-a[i];//同上
    }
    else
    {
        for(int i=0;i<mas;i++)
            a[i]+=b[i];//符号一致时直接相加
    }
    for(int i=0;i<mas;i++)//进位,借位
    {
        if(a[i]<0)
        {
            while(a[i]<0)
            {
                a[i]+=10;
                a[i+1]-=1;
            }
        }
        else if(a[i]>9)
        {
            while(a[i]>9)
            {
                a[i]-=10;
                a[i+1]+=1;
            }
        }
    }
    while(a[mas]==0&&mas>0)mas--;//消去前缀0,同时保证结果为0时输出0
    if(temp&&flag==1||!temp&&flag==2||flag==3)cout<<'-';//如果结果为负,首先输出负号
    for(int i=mas;i>=0;i--)
        cout<<(int)a[i];
    cout<<endl;
    return 0;
}


猜你喜欢

转载自blog.csdn.net/ultrasurreal/article/details/80357272