2 条题解
-
2
再开始做本题前,让我们先分析一下:
这道题与高精度减法2的区别在于这一句话:注意:输入的数可能是负数!
因此我们可以列举出每一种情况以及其算数方法:
a \ b 是负数 不是负数 是负数 做减法,有负号 做加法,有符号 不是负数 做加法,无负号 做减法 其中若a与b均不是负数,则有两种情况:
- 若a >= b ,则无符号
- 若a < b,则有负号
因此,我们可以定义3个bool变量,分别存储a是否为负数,b是否为负数,结果是否为负数,和一个char变量,存储使用加法还是减法,然后在对它们赋值,如下:
bool negative = false , aNegative = false , bNegative = false;
if (a[0] == '-') aNegative = true; if (b[0] == '-') bNegative = true; if (aNegative) { negative = true; if (bNegative) { mod = '-'; //注意这一步不能忘(比较两数大小) if (lena < lenb || (lena == lenb && a < b)) { negative = false;//负负得正,所以要再赋值为false swap(a , b); swap(lena , lenb); } } else mod = '+'; } else if (bNegative) mod = '+'; else { mod = '-'; if (lena < lenb || (lena == lenb && a < b)) { negative = true; swap(a , b); swap(lena , lenb); } }
之后就要将数字存储到数组里,看似简单,实际有点复杂,详见注释吧……
for (int i = aNegative ? 1 : 0 ; i < (aNegative ? lena + 1 : lena) ; i++)//由于第一个字符有可能是负数,所以要从下标为1开始遍历 { numa[aNegative ? i - 1 : i] = a[lena - (aNegative ? i - 2 : i) - 1] - '0';//注意这里是i - 2 } //b同理 for (int i = bNegative ? 1 : 0 ; i < (bNegative ? lenb + 1 : lenb) ; i++) { numb[bNegative ? i - 1 : i] = b[lenb - (bNegative ? i - 2 : i) - 1] - '0'; }
之后就没什么多说的了。
AC Code:
#include <bits/stdc++.h> using namespace std; string a , b; int ans[2100] , numa[2100] , numb[2100] , lena , lenb , top; bool negative = false , aNegative = false , bNegative = false; char mod; int main() { cin >> a >> b; lena = a[0] == '-' ? a.length() - 1 : a.length(); lenb = b[0] == '-' ? b.length() - 1 : b.length(); if (a[0] == '-') aNegative = true; if (b[0] == '-') bNegative = true; if (aNegative) { negative = true; if (bNegative) { mod = '-'; if (lena < lenb || (lena == lenb && a < b)) { negative = false; swap(a , b); swap(lena , lenb); } } else mod = '+'; } else if (bNegative) mod = '+'; else { mod = '-'; if (lena < lenb || (lena == lenb && a < b)) { negative = true; swap(a , b); swap(lena , lenb); } } for (int i = aNegative ? 1 : 0 ; i < (aNegative ? lena + 1 : lena) ; i++) { numa[aNegative ? i - 1 : i] = a[lena - (aNegative ? i - 2 : i) - 1] - '0'; } for (int i = bNegative ? 1 : 0 ; i < (bNegative ? lenb + 1 : lenb) ; i++) { numb[bNegative ? i - 1 : i] = b[lenb - (bNegative ? i - 2 : i) - 1] - '0'; } for (int i = 0 ; i < 2000 ; i++) { if (mod == '+') ans[i] += numa[i] + numb[i]; else ans[i] += numa[i] - numb[i]; } for (int i = 0 ; i < 2000 ; i++) { if (ans[i] < 0) { ans[i] += 10; ans[i + 1]--; } if (ans[i] > 9) { ans[i + 1] += ans[i] / 10; ans[i] %= 10; } } top = 2000; while (ans[top] == 0 && top >= 0) top--; if (negative && top > -1) cout << "-";//注意,没有-0一说,所以要额外特判 for (int i = top ; i >= 0 ; i--) { cout << ans[i]; } if (top == -1) cout << "0"; return 0; }
-
0
写题解请注意
鼓励大家写题解,但注意题解格式。
题解一定要有思路解析或代码注释,能否让别人理解你的思路
也是你的能力的检验,不要只放无意义的代码给大家复制,那就失去了做题的初心。
给代码两端加上这个会舒服一些
```cpp
你的代码
```
这个点在键盘的左上角tab上面那个键,注意切换输入法
#include<iostream> using namespace std; int main() { int n; cin>>n;//这是一个注释 return 0; }
请注意严禁抄袭题解,写题解不要只放代码,需加上你的思路或代码注释。
抄袭题解一经发现直接取消成绩。
题解被删除的可能
- 代码不符合格式规范
- 没有思路讲解或者没有注释,
- 无意义的题解
大家携手共同维护一个良好的编程环境,如果一经发现,多次作乱。可能会被管理员拉黑,请注意,一旦拉黑即失去登陆资格。
- 1
信息
- ID
- 942
- 时间
- 1000ms
- 内存
- 16MiB
- 难度
- 3
- 标签
- 递交数
- 38
- 已通过
- 22
- 上传者