C/C++实现大整数加减法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_26437925/article/details/63260461

http://115.29.224.174/JudgeOnline/problem.php?id=1053

采用存粹的字符串处理,涉及到

  • 数字的优化(符号处理,去零)

  • 字符串数字大小的比较

  • 字符串的加法

  • 字符串的减法

ac代码

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <string>

using namespace std;

string strAdd(string s1, string s2)
{
    string rs ="";

    int len1 = s1.size();
    int len2 = s2.size();

    int carry = 0;
    int i = len1 - 1;
    int j = len2 - 1;

    while(i >= 0 && j >= 0)
    {
        char c1 = s1[i];
        char c2 = s2[j];

        int i1 = c1 - '0';
        int i2 = c2 - '0';

        int tmp = i1 + i2 + carry;
        carry = tmp / 10;

        int nowVal = tmp % 10;
        char nowC = nowVal + '0';

        rs += nowC;

        i--;
        j--;
    }

    if(i >= 0)
    {
        while(i >= 0)
        {
            char c1 = s1[i];

            int i1 = c1 - '0';

            int tmp = i1 + carry;
            carry = tmp / 10;

            int nowVal = tmp % 10;
            char nowC = nowVal + '0';

            rs += nowC;
            i--;
        }
    }

    if(j >= 0)
    {
        while(j >= 0)
        {
            char c2 = s2[j];

            int i2 = c2 - '0';

            int tmp = i2 + carry;
            carry = tmp / 10;

            int nowVal = tmp % 10;
            char nowC = nowVal + '0';

            rs += nowC;
            j--;
        }
    }
    if(carry > 0)
    {
        char nowC = carry + '0';
        rs += nowC;
    }

    string rs2(rs.rbegin(), rs.rend());
    return rs2;
}

// 假设s1 > s2
string strSub(string s1, string s2)
{
    string rs ="";

    int len1 = s1.size();
    int len2 = s2.size();

    int need_carry = 0;

    int i = len1 - 1;
    int j = len2 - 1;

    while(i >= 0 && j >= 0)
    {
        char c1 = s1[i];
        char c2 = s2[j];

        int i1 = c1 - '0';
        int i2 = c2 - '0';

        int nowVal;

        if(need_carry != 0)
        {
            if(i1 < need_carry)
            {
                int tmpi1 = 10 + i1 - need_carry;
                nowVal = tmpi1 - i2;

                need_carry = 1;
            }else{
                int tmpc1 = i1 - need_carry;

                if(tmpc1 >= i2)
                {
                    nowVal = tmpc1 - i2;
                    need_carry = 0;
                }else{
                    nowVal = 10 + tmpc1 - i2;
                    need_carry = 1;
                }

            }
        }else{
            if(i1 >= i2)
            {
                nowVal = i1 - i2;
                need_carry = 0;
            }else{
                nowVal = 10 + i1 - i2;
                need_carry = 1;
            }
        }

        char nowC = nowVal + '0';
        rs += nowC;

        i--;
        j--;
    }

    while(i >= 0)
    {
        char c1 = s1[i];
        int i1 = c1 - '0';

        if(i == 0 && i1 == need_carry)
        {
            break;
        }

        int nowVal;

        if(need_carry != 0)
        {
            if(i1 < need_carry)
            {
                int tmpi1 = 10 + i1 - need_carry;
                nowVal = tmpi1;

                need_carry = 1;
            }else{
                int tmpc1 = i1 - need_carry;

                if(tmpc1 >= 0)
                {
                    nowVal = tmpc1;
                    need_carry = 0;
                }else{
                    nowVal = 10 + tmpc1;
                    need_carry = 1;
                }

            }
        }else{
            if(i1 >= 0)
            {
                nowVal = i1 - 0;
                need_carry = 0;
            }else{
                nowVal = 10 + i1 - 0;
                need_carry = 1;
            }
        }

        char nowC = nowVal + '0';
        rs += nowC;

        i--;
    }

    string rs2(rs.rbegin(), rs.rend());
    return rs2;
}

// 得到一个正确的数,把一些无用的零 去掉
string getRs(string ans)
{
    int len = ans.size();
    if(len <= 0)
        return "0";

    if(ans[0] == '-')
    {
        int k = 1;

        while(k < len && ans[k] == '0')
            k++;

        if(k == len)
            return "0";
        else{
            return "-" + ans.substr(k);
        }

    }else{

        int k = 0;

        while(k < len && ans[k] == '0')
            k++;

        if(k == len)
            return "0";
        else{
            return ans.substr(k);
        }
    }
}

// 判断两个数谁大, 两个数都是有效的正数
int cp(string s1, string s2)
{
    int len1 = s1.size();
    int len2 = s2.size();
    if(len1 > len2)
        return 1;
    else if(len1 < len2)
        return -1;
    else{
        for(int i=0;i<len1;i++)
        {
            if(s1[i] > s2[i])
                return 1;
            if(s1[i] < s2[i])
                return -1;
        }
    }
    return 0;
}

// 假设s1 s2 都是合法的数字
string strCal(string s1,string s2)
{
    int flag1 = 1;
    int flag2 = 1;

    if(s1[0] == '-')
    {
        s1 = s1.substr(1);
        flag1 = -1;
    }else if(s1[0] == '+')
    {
        s1 = s1.substr(1);
    }

    if(s2[0] == '-')
    {
        s2 = s2.substr(1);
        flag2 = -1;
    }else if(s2[0] == '+')
    {
        s2 = s2.substr(1);
    }

    string ans;

    if(flag1 == 1 && flag2 == 1)
    {
        //return strAdd(s1, s2);
        ans = strAdd(s1, s2);

    }else if(flag1 == -1 && flag2 == -1)
    {
        string rs = strAdd(s1, s2);
        rs = "-" + rs;
        //return rs;
        ans = rs;
    }else if(flag1 == 1 && flag2 == -1)
    {
        if(cp(s1, s2) >= 0)
        {
            //return strSub(s1, s2);
            ans = strSub(s1, s2);
        }else{
            string rs = strSub(s2, s1);
            rs = "-" + rs;
            //return rs;
            ans = rs;
        }
    }else{
        if(cp(s2, s1) >= 0)
        {
            //return strSub(s2, s1);
            ans = strSub(s2, s1);
        }else{
            string rs = strSub(s1, s2);
            rs = "-" + rs;
            //return rs;
            ans = rs;
        }
    }

    return getRs(ans);
}

int main()
{
    //freopen("in.txt", "r", stdin);
    string s1,s2;
    while(cin >> s1 >> s2)
    {
        s1 = getRs(s1);
        s2 = getRs(s2);

        string ans = strCal(s1,s2);

        cout << ans << endl;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_26437925/article/details/63260461