大数加减法运算中如何实现负数的加减法;以及为什么交换数据输入后,会报错,还有两个数相减时不会输出结果
#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 <,如下:
另外,建议将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函数中根据上面的情况调用相应的函数进行计算,这样代码的逻辑会比较清晰。
带符号位的代码,修改后运行结果:
代码:
#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;
}
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!