大数运算中如何计算含有负数的加减法(只考虑整数)

问题遇到的现象和发生背景

大数加减法运算中如何实现负数的加减法;以及为什么交换数据输入后,会报错,还有两个数相减时不会输出结果

问题相关代码,请勿粘贴截图

#include
#include<string.h>
#include
#include
#include
using namespace std;

void operation(string a,char oper, string b)
{
vectorstr1;//定义动态数组
vectorstr2;
vectorsum; //定义结果数组
for (int i = a.length() - 1; i >= 0; i--)//将输入的字符串传入动态数组中
{
str1.push_back(a[i] - '0'); //将字符型转化为int型
}
for (int i = b.length() - 1; i >= 0; i--)
{
str2.push_back(b[i] - '0');
}
switch (oper)
{
int flag = 0;//变量
int i = 0;
case'+':
for (; i < str1.size() && str2.size(); i++)
{
sum.push_back((str1[i] + str2[i] + flag) % 10);
flag = (str1[i] + str2[i] + flag) / 10;
}
if (str1.size() >= str2.size())
{

        for (; i < str1.size(); i++)
        {
            sum.push_back((str1[i] + flag) % 10);
            flag = (str1[i] + flag) / 10;
        }
    }
    else
    {
        for (; i < str2.size(); i++)
        {
            sum.push_back((str2[i] + flag) % 10);
            flag = (str2[i] + flag) / 10;
        }
    }
    sum.push_back(flag);             //逢十进一
    reverse(sum.begin(), sum.end());//将数组逆置
    if (sum[0] != 0)               //判断第一个数据是否为零
    {
        for (int i = 0; i < sum.size(); i++)
        {
            cout << sum[i];
        }
    }
    else
    {
        for (int i = 1; i < sum.size(); i++)
        {
            cout << sum[i];
        }
    }
    break;

case'-':

    if (str1.size() >= str2.size())
    {
        for (; i < str2.size(); i++)
        {  
            if (str1[i] >= str2[i])
            {
                sum.push_back((str1[i] - str2[i] - flag)%10);
                flag = (str1[i] - str2[i] - flag)/10;
            }
            else 
            {
                sum.push_back((str1[i] + 10 - str2[i] - flag) % 10);
                flag = (str1[i] + 10 - str2[i] - flag) / 10;
            }
        }
        for (; i < str1.size(); i++)
        {
            if (str1[i] >= 1)
            {
                sum.push_back((str1[i] - flag)%10);
                flag = (str1[i] - flag)/10;
            }
            else
            {
                sum.push_back((str1[i] + 10 - flag) % 10);
                flag = (str1[i] + 10 - flag) / 10;
            }
        }
        reverse(sum.begin(), sum.end());
        if (sum[0] != 0)               //判断第一个数据是否为零
        {
            for (int i = 0; i < sum.size(); i++)
            {
                cout << sum[i];
            }
        }
        else
        {
            for (int i = 1; i < sum.size(); i++)
            {
                cout << sum[i];
            }
        }
        
    }
    else
    {
        for (; i < str1.size(); i++)
        {
            if (str2[i] >= str1[i])
            {
                sum.push_back((str2[i] - str1[i] - flag) % 10);
                flag = (str2[i] - str1[i] - flag) / 10;
            }
            else
            {
                sum.push_back((str2[i] + 10 - str1[i] - flag) % 10);
                flag = (str2[i] + 10 - str1[i] - flag) / 10;
            }
        }
        for (; i < str2.size(); i++)
        {
            if (str2[i] >= 1)
            {
                sum.push_back((str2[i] - flag) % 10);
                flag = (str2[i] - flag) / 10;
            }
            else
            {
                sum.push_back((str2[i] + 10 - flag) % 10);
                flag = (str1[i] + 10 - flag) / 10;
            }
            sum.push_back('-');
        }
        reverse(sum.begin(), sum.end());
        if (sum[0] != 0)               //判断第一个数据是否为零
        {
            for (int i = 0; i < sum.size(); i++)
            {
                cout << sum[i];
            }
        }
        else
        {
            for (int i = 1; i < sum.size(); i++)
            {
                cout << sum[i];
            }
        }
    }
    
    break;
}

}
int main()
{
string str1;
string str2;
char oper;
cout << "请输入:" << endl;
cin >> str1 >>oper >> str2;
operation(str1,oper,str2);
system("pause");
return 0;
}

运行结果及报错内容

当输入1+999999时会正确输出结果,当输入9999999+1,程序会出错
以及输入两个数相减时不会输出结果

还有无法进行输入数字为负数的情况

我的解答思路和尝试过的方法
我想要达到的结果

能够正确的运行大数运算,包括含有负数的情况

1.代码的问题:
在计算加法的时候,第一个for循环中,条件部分应该是 i < str1.size() && i<str2.size(),&& 后面你漏写了 i <,如下:

img

另外,建议将switch中的 int flag = 0; int i=0;这两句放在switch外面。部分编译器不支持在switch中声明变量。

2.带负号的问题

步骤如下:
1.先提取两个数的符号,vector中只保留数字部分
2.根据两个数的符号和oper 决定要执行的操作。
2.1 当oper为'-'时,a为正,b为正,执行str1 - str2;
2.2 当oper为‘-‘时,a为正,b为负,执行str1 + str2;
2.3 当oper为‘-‘时,a为负,b为负,执行str2 - str1;
2.4 当oper为‘-‘时,a为负,b为正,执行str1 + str2,结果取反;
2.5 当oper为‘+‘时,a为正,b为正,执行str1 + str2;
2.6 当oper为‘+‘时,a为正,b为负,执行str1 - str2;
2.7 当oper为‘+‘时,a为负,b为负,执行str1 + str2,结果取反;
2.8 当oper为‘+‘时,a为负,b为正,执行str2 - str1;

小建议:
建议把数组的加法和减法单独封装成独立的sub函数和add函数,然后在operation函数中根据上面的情况调用相应的函数进行计算,这样代码的逻辑会比较清晰。
带符号位的代码,修改后运行结果:

img

代码:

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>

using namespace std;

//加法
void add(vector<int> s1,vector<int> s2,vector<int>& sum)
{
    int i=0,flag = 0;
    for(;i<s1.size() && i<s2.size();i++)
    {
        int t = s1.at(i) + s2.at(i) + flag;
        sum.push_back(t%10);
        flag = t/10;
    }

    if(i<s1.size())
    {
        for(;i<s1.size();i++)
        {
            int t = s1.at(i) + flag;
            sum.push_back(t%10);
            flag = t/10;
        }
    }
    if(i<s2.size())
    {
        for (;i<s2.size();i++)
        {
            int t = s2.at(i) + flag;
            sum.push_back(t%10);
            flag = t/10;
        }
    }
    if(flag != 0)
        sum.push_back(flag);

}


//减法
void sub_s(vector<int> s1,vector<int> s2,vector<int>& sum)
{
    int i=0,flag = 0;
    for(;i<s2.size();i++ )
    {
        int t = s1.at(i) - s2.at(i) + flag;
        if(t<0)
        {
            t += 10;
            flag = -1;//借位
        }else
        {
            flag = 0;
        }
        sum.push_back(t);
    }
    //s1中剩余部分
    for(;i<s1.size();i++)
    {
        int t = s1.at(i) + flag;
        if(t<0)
        {
            t += 10;
            flag = -1;
        }else
            flag = 0;
        sum.push_back(t);
    }
}
//判断大小,如果s1>s2,返回1,s1==s2返回0,s1<s2返回-1
int comp(vector<int> s1,vector<int> s2)
{
    if(s1.size() > s2.size() )
        return 1;
    else if(s1.size() < s2.size())
        return -1;
    else if(s1.size() == s2.size() )
    {
        int i=s1.size()-1;
        for(;i>=0;i--)
        {
            if(s1.at(i)> s2.at(i))
                return 1;
            else if(s1.at(i) < s2.at(i))
                return -1;
        }
        if(i==-1) //两者相等
            return 0;
    }
}

//减法,大数减去小数,可以根据长度判断大小
int sub(vector<int> s1,vector<int> s2,vector<int> &sum)
{
    int ret = comp(s1,s2);
    if(ret == 1)
    {
        sub_s(s1,s2,sum);
        return 1; //表示正
    }
    else if(ret == 0)
    {
        sum.push_back(0);
        return 1;
    }
    else
    {
        sub_s(s2,s1,sum);
        return -1;//表示负
    }
}

//显示结果
void show(vector<int> sum,int flag)
{
    if(flag == -1)
    {
        cout << "-";//输出负号
    }
    for(int i = sum.size()-1;i>=0;i--)
        cout << sum.at(i);
    cout << endl;
}


void operation(string a,char oper, string b)
{
    vector<int> str1;//定义动态数组
    vector<int> str2;
    vector<int> sum; //定义结果数组

    char f1,f2;

    //符号位
    if(a[0] =='-' )
        f1 = '-';
    else
        f1 = '+';

    if(b[0] == '-')
        f2 = '-';
    else
        f2 = '+';

    //数字部分放入vector
    for (int i = a.length() - 1; i >= 0; i--)//将输入的字符串传入动态数组中
    {
        if(a[i]>='0' && a[i]<='9')
            str1.push_back(a[i] - '0'); //将字符型转化为int型
    }
    for (int i = b.length() - 1; i >= 0; i--)
    {
        if(b[i]>='0' &&b[i]<='9')
            str2.push_back(b[i] - '0');
    }

    //根据运算符计算
    int fres = 1; //运算结果的符号位,减法用
    if(oper == '+')
    {
        if(f1 =='+' && f2=='+')
        {
            add(str1,str2,sum);
            show(sum,1);
        }else if(f1 =='+' && f2=='-')
        {
            fres = sub(str1,str2,sum);
            show(sum,fres);
        }else if(f1=='-' && f2=='-')
        {
            add(str1,str2,sum);
            show(sum,-1);
        }else
        {
            fres = sub(str2,str1,sum);
            show(sum,fres);
        }
    }else
    {
        if(f1=='+' && f2 =='+')
        {
            fres = sub(str1,str2,sum);
            show(sum,fres);
        }else if(f1=='+' && f2=='-')
        {
            add(str1,str2,sum);
            show(sum,1);
        }else if(f1=='-' && f2=='+')
        {
            add(str1,str2,sum);
            show(sum,-1);
        }else
        {
            fres = sub(str2,str1,sum);
            show(sum,fres);
        }
    }
    
}
int main()
{
    string str1;
    string str2;
    char oper;
    cout << "请输入:" << endl;
    cin >> str1 >> oper >> str2;
    operation(str1,oper,str2);
    system("pause");
    return 0;
}

建议你看看这篇文章

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632