m0_72524251 2022-07-02 17:06 采纳率: 77.8%
浏览 78
已结题

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

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

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

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

#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())
{

  1. for (; i < str1.size(); i++)
  2. {
  3. sum.push_back((str1[i] + flag) % 10);
  4. flag = (str1[i] + flag) / 10;
  5. }
  6. }
  7. else
  8. {
  9. for (; i < str2.size(); i++)
  10. {
  11. sum.push_back((str2[i] + flag) % 10);
  12. flag = (str2[i] + flag) / 10;
  13. }
  14. }
  15. sum.push_back(flag); //逢十进一
  16. reverse(sum.begin(), sum.end());//将数组逆置
  17. if (sum[0] != 0) //判断第一个数据是否为零
  18. {
  19. for (int i = 0; i < sum.size(); i++)
  20. {
  21. cout << sum[i];
  22. }
  23. }
  24. else
  25. {
  26. for (int i = 1; i < sum.size(); i++)
  27. {
  28. cout << sum[i];
  29. }
  30. }
  31. break;
  32. case'-':
  33. if (str1.size() >= str2.size())
  34. {
  35. for (; i < str2.size(); i++)
  36. {
  37. if (str1[i] >= str2[i])
  38. {
  39. sum.push_back((str1[i] - str2[i] - flag)%10);
  40. flag = (str1[i] - str2[i] - flag)/10;
  41. }
  42. else
  43. {
  44. sum.push_back((str1[i] + 10 - str2[i] - flag) % 10);
  45. flag = (str1[i] + 10 - str2[i] - flag) / 10;
  46. }
  47. }
  48. for (; i < str1.size(); i++)
  49. {
  50. if (str1[i] >= 1)
  51. {
  52. sum.push_back((str1[i] - flag)%10);
  53. flag = (str1[i] - flag)/10;
  54. }
  55. else
  56. {
  57. sum.push_back((str1[i] + 10 - flag) % 10);
  58. flag = (str1[i] + 10 - flag) / 10;
  59. }
  60. }
  61. reverse(sum.begin(), sum.end());
  62. if (sum[0] != 0) //判断第一个数据是否为零
  63. {
  64. for (int i = 0; i < sum.size(); i++)
  65. {
  66. cout << sum[i];
  67. }
  68. }
  69. else
  70. {
  71. for (int i = 1; i < sum.size(); i++)
  72. {
  73. cout << sum[i];
  74. }
  75. }
  76. }
  77. else
  78. {
  79. for (; i < str1.size(); i++)
  80. {
  81. if (str2[i] >= str1[i])
  82. {
  83. sum.push_back((str2[i] - str1[i] - flag) % 10);
  84. flag = (str2[i] - str1[i] - flag) / 10;
  85. }
  86. else
  87. {
  88. sum.push_back((str2[i] + 10 - str1[i] - flag) % 10);
  89. flag = (str2[i] + 10 - str1[i] - flag) / 10;
  90. }
  91. }
  92. for (; i < str2.size(); i++)
  93. {
  94. if (str2[i] >= 1)
  95. {
  96. sum.push_back((str2[i] - flag) % 10);
  97. flag = (str2[i] - flag) / 10;
  98. }
  99. else
  100. {
  101. sum.push_back((str2[i] + 10 - flag) % 10);
  102. flag = (str1[i] + 10 - flag) / 10;
  103. }
  104. sum.push_back('-');
  105. }
  106. reverse(sum.begin(), sum.end());
  107. if (sum[0] != 0) //判断第一个数据是否为零
  108. {
  109. for (int i = 0; i < sum.size(); i++)
  110. {
  111. cout << sum[i];
  112. }
  113. }
  114. else
  115. {
  116. for (int i = 1; i < sum.size(); i++)
  117. {
  118. cout << sum[i];
  119. }
  120. }
  121. }
  122. break;
  123. }

}
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

    代码:

    1. #include <iostream>
    2. #include <string>
    3. #include <vector>
    4. #include <algorithm>
    5. using namespace std;
    6. //加法
    7. void add(vector<int> s1,vector<int> s2,vector<int>& sum)
    8. {
    9. int i=0,flag = 0;
    10. for(;i<s1.size() && i<s2.size();i++)
    11. {
    12. int t = s1.at(i) + s2.at(i) + flag;
    13. sum.push_back(t%10);
    14. flag = t/10;
    15. }
    16. if(i<s1.size())
    17. {
    18. for(;i<s1.size();i++)
    19. {
    20. int t = s1.at(i) + flag;
    21. sum.push_back(t%10);
    22. flag = t/10;
    23. }
    24. }
    25. if(i<s2.size())
    26. {
    27. for (;i<s2.size();i++)
    28. {
    29. int t = s2.at(i) + flag;
    30. sum.push_back(t%10);
    31. flag = t/10;
    32. }
    33. }
    34. if(flag != 0)
    35. sum.push_back(flag);
    36. }
    37. //减法
    38. void sub_s(vector<int> s1,vector<int> s2,vector<int>& sum)
    39. {
    40. int i=0,flag = 0;
    41. for(;i<s2.size();i++ )
    42. {
    43. int t = s1.at(i) - s2.at(i) + flag;
    44. if(t<0)
    45. {
    46. t += 10;
    47. flag = -1;//借位
    48. }else
    49. {
    50. flag = 0;
    51. }
    52. sum.push_back(t);
    53. }
    54. //s1中剩余部分
    55. for(;i<s1.size();i++)
    56. {
    57. int t = s1.at(i) + flag;
    58. if(t<0)
    59. {
    60. t += 10;
    61. flag = -1;
    62. }else
    63. flag = 0;
    64. sum.push_back(t);
    65. }
    66. }
    67. //判断大小,如果s1>s2,返回1,s1==s2返回0,s1<s2返回-1
    68. int comp(vector<int> s1,vector<int> s2)
    69. {
    70. if(s1.size() > s2.size() )
    71. return 1;
    72. else if(s1.size() < s2.size())
    73. return -1;
    74. else if(s1.size() == s2.size() )
    75. {
    76. int i=s1.size()-1;
    77. for(;i>=0;i--)
    78. {
    79. if(s1.at(i)> s2.at(i))
    80. return 1;
    81. else if(s1.at(i) < s2.at(i))
    82. return -1;
    83. }
    84. if(i==-1) //两者相等
    85. return 0;
    86. }
    87. }
    88. //减法,大数减去小数,可以根据长度判断大小
    89. int sub(vector<int> s1,vector<int> s2,vector<int> &sum)
    90. {
    91. int ret = comp(s1,s2);
    92. if(ret == 1)
    93. {
    94. sub_s(s1,s2,sum);
    95. return 1; //表示正
    96. }
    97. else if(ret == 0)
    98. {
    99. sum.push_back(0);
    100. return 1;
    101. }
    102. else
    103. {
    104. sub_s(s2,s1,sum);
    105. return -1;//表示负
    106. }
    107. }
    108. //显示结果
    109. void show(vector<int> sum,int flag)
    110. {
    111. if(flag == -1)
    112. {
    113. cout << "-";//输出负号
    114. }
    115. for(int i = sum.size()-1;i>=0;i--)
    116. cout << sum.at(i);
    117. cout << endl;
    118. }
    119. void operation(string a,char oper, string b)
    120. {
    121. vector<int> str1;//定义动态数组
    122. vector<int> str2;
    123. vector<int> sum; //定义结果数组
    124. char f1,f2;
    125. //符号位
    126. if(a[0] =='-' )
    127. f1 = '-';
    128. else
    129. f1 = '+';
    130. if(b[0] == '-')
    131. f2 = '-';
    132. else
    133. f2 = '+';
    134. //数字部分放入vector
    135. for (int i = a.length() - 1; i >= 0; i--)//将输入的字符串传入动态数组中
    136. {
    137. if(a[i]>='0' && a[i]<='9')
    138. str1.push_back(a[i] - '0'); //将字符型转化为int型
    139. }
    140. for (int i = b.length() - 1; i >= 0; i--)
    141. {
    142. if(b[i]>='0' &&b[i]<='9')
    143. str2.push_back(b[i] - '0');
    144. }
    145. //根据运算符计算
    146. int fres = 1; //运算结果的符号位,减法用
    147. if(oper == '+')
    148. {
    149. if(f1 =='+' && f2=='+')
    150. {
    151. add(str1,str2,sum);
    152. show(sum,1);
    153. }else if(f1 =='+' && f2=='-')
    154. {
    155. fres = sub(str1,str2,sum);
    156. show(sum,fres);
    157. }else if(f1=='-' && f2=='-')
    158. {
    159. add(str1,str2,sum);
    160. show(sum,-1);
    161. }else
    162. {
    163. fres = sub(str2,str1,sum);
    164. show(sum,fres);
    165. }
    166. }else
    167. {
    168. if(f1=='+' && f2 =='+')
    169. {
    170. fres = sub(str1,str2,sum);
    171. show(sum,fres);
    172. }else if(f1=='+' && f2=='-')
    173. {
    174. add(str1,str2,sum);
    175. show(sum,1);
    176. }else if(f1=='-' && f2=='+')
    177. {
    178. add(str1,str2,sum);
    179. show(sum,-1);
    180. }else
    181. {
    182. fres = sub(str2,str1,sum);
    183. show(sum,fres);
    184. }
    185. }
    186. }
    187. int main()
    188. {
    189. string str1;
    190. string str2;
    191. char oper;
    192. cout << "请输入:" << endl;
    193. cin >> str1 >> oper >> str2;
    194. operation(str1,oper,str2);
    195. system("pause");
    196. return 0;
    197. }

    展开全部

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

    如有帮助,望采纳,多谢。

    img

    回复
    m0_72524251 2022-07-03 03:15

    你好,请问含负号的如何实现呢,能否具体一点

    回复
    技术专家团-小桥流水 回复 m0_72524251 2022-07-03 04:04

    代码写了,贴在上面了。没问题的话请帮忙采纳一下,谢谢。

    img

    回复
    展开全部4条评论
查看更多回答(2条)
编辑
预览

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 7月3日
  • 已采纳回答 7月3日
  • 创建了问题 7月2日
手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部