C++大数(正整数)相加相减v1

#include<iostream>
#include<string>
using namespace std;

bool isValid(string s)
{
    if(s.size()==0) return false;

    for(int i=0;i<s.size();i++)
    {
        if(s[i]>'9' || s[i]<'0')
            return false;
    }
    return true;
}
string formatStr(string s)
{
    if(!isValid(s)) return "0";
    int i=0;
    for(;i<s.size();i++)
    {
        if(s[i]!='0')
        {
            break;
        }
    }
    if(s.size()==i)   return "0";
    else return s.substr(i,s.size()-i);
}

class BigPositiveNum
{
private:
    string val;
public:
    BigPositiveNum(){ val="0";}
    BigPositiveNum(string s)
    {
        val=formatStr(s);
    }

    BigPositiveNum add(string s)
    {
        if(!isValid(s)) return *this;
        string s1=val.size()>s.size()?val:s;//longer one
        string s2=val.size()>s.size()?s:val;//shorter one
        string res;

        int p1=s1.size()-1;
        int p2=s2.size()-1;
        int takeover=0;//进位
        for(;p2>=0;p2--,p1--)
        {
            int n1=s1[p1]-'0';
            int n2=s2[p2]-'0';
            int sum=n1+n2+takeover;
            if(sum<10)
            {
                takeover=0;
                res=(char)('0'+sum)+res;
            }else
            {
                takeover=1;
                sum=sum%10;
                res=(char)('0'+sum)+res;
            }
        }

        while(takeover&& (p1>=0))
        {
            int sum=s1[p1]-'0'+takeover;
            p1--;
            if(sum<10)
            {
                takeover=0;
                res=(char)('0'+sum)+res;
            }else
            {
                takeover=1;
                sum%=10;
                res=(char)('0'+sum)+res;
            }
        }
        //string substr(int pos = 0,int n = npos) const;//返回pos开始的n个字符组成的字符串
        if(takeover) res='1'+s1.substr(0,p1+1)+res;
        else res=s1.substr(0,p1+1)+res;

        return BigPositiveNum(res);
    }
    BigPositiveNum subtrt(string s)
    {
        if(!isValid(s)) return *this;
        s=formatStr(s);
        if(val==s)  return BigPositiveNum();

        string s1,s2;
        bool isNeg=false;
        if(val.size()<s.size() || val<s)
        {
            isNeg=true;
            cout<<"计算结果为负数,我们将计算差的绝对值"<<endl;
            s1=s;//bigger one
            s2=val;
        }else
        {
            s1=val;
            s2=s;
        }

        string res;

        int p1=s1.size()-1;
        int p2=s2.size()-1;
        int borrow=0;//借位
        for(;p2>=0;p2--,p1--)
        {
            int n1=s1[p1]-'0';
            int n2=s2[p2]-'0';
            if(borrow)
            {
                n1--;
                if(n1>=n2)
                {
                    borrow=0;
                    res=(char)('0'+n1-n2)+res;
                }else
                {
                    borrow=1;
                    res=(char)('0'+n1+10-n2)+res;
                }
            }else
            {
                if(n1>=n2)
                {
                    borrow=0;
                    res=(char)('0'+n1-n2)+res;
                }else
                {
                    borrow=1;
                    res=(char)('0'+n1+10-n2)+res;
                }
            }
        }

        while(borrow&&(p1>=0))
        {
            int n1=s1[p1]-'0'-1;
            p1--;
            if(n1>=0)
            {
                borrow=0;
                res=(char)('0'+n1)+res;
            }else
            {
                res='9'+res;
            }
        }
        if(p1>=0)   res=s1.substr(0,p1+1)+res;

        return BigPositiveNum(res);
    }

    void show()
    {
        cout<<formatStr(val)<<endl;
    }
};
int main()
{
    cout<<"a add b"<<endl;
    BigPositiveNum x("9999999999999999999999999999999999999999999999999999");
    (x.add("1")).show();

    cout<<"a subtract b"<<endl;
    BigPositiveNum a("2000000000000000000000000000000000000000000000000");
    (a.subtrt("2")).show();

    return 0;
}
/*output
a add b
10000000000000000000000000000000000000000000000000000
a subtract b
1999999999999999999999999999999999999999999999998
*/

转载于:https://my.oschina.net/SnifferApache/blog/728875

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值