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

来源:互联网 发布:少女前线敌人数据 编辑:程序博客网 时间:2024/05/18 02:21

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 > s2string 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;}
0 0
原创粉丝点击