m0_72524251 2022-07-03 01:06 采纳率: 77.8%
浏览 72
已结题

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

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

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

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

#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,程序会出错
以及输入两个数相减时不会输出结果

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

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

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

  • 写回答

3条回答 默认 最新

  • 关注

    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;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 7月3日
  • 已采纳回答 7月3日
  • 创建了问题 7月3日

悬赏问题

  • ¥200 总是报错,能帮助用python实现程序实现高斯正反算吗?有偿
  • ¥15 对于squad数据集的基于bert模型的微调
  • ¥15 为什么我运行这个网络会出现以下报错?CRNN神经网络
  • ¥20 steam下载游戏占用内存
  • ¥15 CST保存项目时失败
  • ¥15 树莓派5怎么用camera module 3啊
  • ¥20 java在应用程序里获取不到扬声器设备
  • ¥15 echarts动画效果的问题,请帮我添加一个动画。不要机器人回答。
  • ¥15 Attention is all you need 的代码运行
  • ¥15 一个服务器已经有一个系统了如果用usb再装一个系统,原来的系统会被覆盖掉吗