小米OJ003 大数相减

描述

两个长度超出常规整形变量上限的大数相减,请避免使用各语言内置大数处理库,如 Java.math.BigInteger 等。 ### 输入

有 N 行测试数据,每一行有两个代表整数的字符串 a 和 b,长度超过百位。规定 a>=b,a, b > 0。 测试结果可以用 linux 小工具 bc进行测试是否正确。

输出

返回表示结果整数的字符串。

输入样例

1
2
1231231237812739878951331231231237812739878951331231231237812739878951331231231237812739878951331231231237812739878951331231231237812739870-89513312312312378127398789513312312312378127398789513312312312378127398789513
1231231237812739878951331231231237812739878951331231231237812739878951331230000000000000000000000001-331231231237812739878951331231231

输出样例

1
2
1231231237812739878951331231231237812739878951331231231237812650365639018918853110413950365639018918853110413950365639018918853110413950357
1231231237812739878951331231231237812739878951331231231237812739878620099998762187260121048668768770

参考答案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <iostream>
#include <string>

using namespace std;

int main()
{
string a, b, str;
int lena, lenb;
int i, j, k;

cin >> str;

k = str.find('-');
a = str.substr(0, k);
b = str.substr(k + 1, str.length());
lena = a.length();
lenb = b.length();

for (i = lenb - 1, j = lena - 1; i >= 0; i--, j--) {
a[j] = a[j] - b[i] + '0'; // 做减法
if (a[j] < '0') { // 有借位
k = j - 1;
while (a[k] == '0') { // 查找最高能借位
a[k--] = '9';
}
a[k] = a[k] - 1;
a[j] = a[j] + 10;
}
}

for (i = 0; i < lena; i++) { // 查找最高不为 0 位
if (a[i] != '0')
break;
}

for (; i < lena; i++) // 开始输出
cout << a[i];

return 0;
}

思路

注意题目输入的格式,一行之中有 a 有 b,且用 - 分隔。此时,可用 c 语言风格字符串和 scanf 直接完成 a,b 的输入,我则用 string 类型死磕到底。完成 a,b 的输入。具体减法流程其实很简单,参考代码注释,最后输出即可。

# XiaoMi

Comments

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×