C++186行超长高精度加法(支持负数)

36 篇文章 0 订阅
28 篇文章 1 订阅

免费赠送的干货代码!还不快快复制一份!!!

//
//Created by Carlgood.
//
//Note:This program is written in version DEV-C++ 5.11.
# include <iostream>
# include<cmath>
# include<string>
# include<cstring>
# include<cstdio>
# include<algorithm>
# include<sstream>
# include<vector> 
# define This_program_is_written_by_Carlgood_Programming_Studio 9876543210
using namespace std;
const int N=1e6+10;
int c[N],d[N],he[N];
string max1(string a,string b)
{
    if(a.size()>b.size()){return a;}
    if(b.size()>a.size()){return b;}
    if(a>b){return a;}
    if(b>a){return b;}
}
string min1(string a,string b)
{
    if(a.size()<b.size()){return a;}
    if(b.size()<a.size()){return b;}
    if(a<b){return a;}
    if(b<a){return b;}
}
int main()
{
	//freopen("plus.in","w",stdin);
	//freopen("plus.out","r",stdout);
    string a,b;
    cin>>a>>b;
    if(a.find("-")==string::npos&&b.find("-")==string::npos)
    {
        int j=0,i,m,t=0;
        int la=a.size(),lb=b.size();
        if(a=="0"&&b=="0")
        {
            cout<<"0";
            return 0;
        }
        for(i=la-1;i>=0;i--)
        {
            j++;
            c[j]=a[i]-'0';
        }
        j=0;
        for(i=lb-1;i>=0;i--)
        {
            j++;
            d[j]=b[i]-'0';
        }
        m=max(la,lb)+1;
        for(i=1;i<=max(la,lb)+1;i++)
        {
            he[i]=(c[i]+d[i]+t)%10;
            t=(c[i]+d[i]+t)/10;
        }
        int h=max(la,lb)+1;
        for(i=h;i>=1;i--)
        {
            if(he[i]!=0)
            {
                h=i;
                break;
            }
        }
        for(i=h;i>=1;i--)
        {
            cout<<he[i];
        }
    }
    if(a.find("-")==string::npos&&b.find("-")!=string::npos||a.find("-")!=string::npos&&b.find("-")==string::npos)
    {
        string ka=max1(a,b),kb=min1(a,b);
        int j=0,i;
        bool f;
        int la=ka.size(),lb=kb.size();
        if(ka.find("-")!=string::npos)
        {
            ka.erase(ka.begin());
            la--;f=1;
        }
        if(kb.find("-")!=string::npos)
        {
            kb.erase(kb.begin());
            lb--;f=0;
        }
        string maxn=max1(ka,kb);
        if(maxn==ka&&f==1||maxn==kb&&f==0)
        {
            cout<<"-";
        }
        if(ka==kb)
        {
            cout<<"0";
            return 0;
        }
        for(i=la-1;i>=0;i--)
        {
            j++;
            c[j]=ka[i]-'0';
        }
        j=0;
        for(i=lb-1;i>=0;i--)
        {
            j++;
            d[j]=kb[i]-'0';
        }
        int k=0;
        for(i=1;i<=la;i++)
        {
            int t=c[i]-k-d[i];
            if(t<0)
            {
                he[i]=c[i]-k+10-d[i];
                k=1;
            }
            else
            {
                he[i]=c[i]-k-d[i];
                k=0;
            }
        }
        for(i=la;i>=1;i--)
        {
            if(he[i]!=0)
            {
                la=i;
                break;
            }
        }
        for(i=la;i>=1;i--)
        {
            cout<<he[i];
        }
    }
    if(a.find("-")!=string::npos&&b.find("-")!=string::npos)
    {
        a.erase(a.begin());
        b.erase(b.begin());
        int j=0,i,m,t=0;
        int la=a.size(),lb=b.size();
        if(a=="0"&&b=="0")
        {
            cout<<"0";
            return 0;
        }
        for(i=la-1;i>=0;i--)
        {
            j++;
            c[j]=a[i]-'0';
        }
        j=0;
        for(i=lb-1;i>=0;i--)
        {
            j++;
            d[j]=b[i]-'0';
        }
        m=max(la,lb)+1;
        for(i=1;i<=max(la,lb)+1;i++)
        {
            he[i]=(c[i]+d[i]+t)%10;
            t=(c[i]+d[i]+t)/10;
        }
        int h=max(la,lb)+1;
        for(i=h;i>=1;i--)
        {
            if(he[i]!=0)
            {
                h=i;
                break;
            }
        }
        cout<<"-";
        for(i=h;i>=1;i--)
        {
            cout<<he[i];
        }
    }
    return 0;
}

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值