题解:洛谷 P2142 高精度减法
【题目来源】
【题目描述】
高精度减法。
【输入】
两个整数 \(a,b\)(第二个可能比第一个大)。
【输出】
结果(是负数要输出负号)。
【输入样例】
2
1
【输出样例】
1
【算法标签】
《洛谷 P2142 高精度减法》 #模拟# #字符串# #高精度# #洛谷原创#
【代码详解】
#include <bits/stdc++.h>
using namespace std;
const int N = 100005; // 定义数组的最大长度
int A[N], B[N], C[N]; // A和B用于存储输入的两个大数,C用于存储结果
int la, lb, lc; // la, lb分别表示A和B的长度,lc表示结果C的长度
string a, b; // 用于存储输入的两个大数的字符串形式
// 比较函数,用于比较两个大数的大小
bool cmp(int A[], int B[])
{
if (la != lb) return la > lb; // 如果长度不同,直接比较长度
for (int i = la - 1; i >= 0; i--) // 从最高位开始逐位比较
if (A[i] != B[i])
return A[i] > B[i]; // 如果某一位不同,返回比较结果
return true; // 如果所有位都相同,返回true,避免结果为-0
}
// 大数减法函数,计算A - B,结果存储在C中
void sub(int A[], int B[], int C[])
{
for (int i = 0; i < lc; i++) {
if (A[i] < B[i]) {
A[i + 1]--; // 借位
A[i] += 10; // 当前位加10
}
C[i] = A[i] - B[i]; // 计算当前位的差值并存储在C中
}
while (lc && C[lc] == 0) lc--; // 去掉结果中的前导0
}
int main()
{
cin >> a >> b; // 输入两个大数
la = a.size(), lb = b.size(), lc = max(la, lb); // 计算长度
// 将字符串形式的大数转换为数组形式,并逆序存储(方便计算)
for (int i = la - 1; i >= 0; i--)
A[la - 1 - i] = a[i] - '0';
for (int i = lb - 1; i >= 0; i--)
B[lb - 1 - i] = b[i] - '0';
// 如果A小于B,交换A和B,并输出负号
if (!cmp(A, B)) {
swap(A, B);
cout << '-';
}
// 执行减法操作
sub(A, B, C);
// 输出结果
for (int i = lc; i >= 0; i--)
cout << C[i];
return 0;
}
#include <bits/stdc++.h>
using namespace std;
string a, b; // 用于存储输入的两个大数的字符串形式
vector<int> A, B; // 使用vector存储大数的每一位,方便动态调整大小
// 比较函数,用于比较两个大数的大小
bool cmp(vector<int> &A, vector<int> &B)
{
if (A.size() != B.size()) return A.size() > B.size(); // 如果长度不同,直接比较长度
for (int i = A.size() - 1; i >= 0; i--) // 从最高位开始逐位比较
if (A[i] != B[i])
return A[i] > B[i]; // 如果某一位不同,返回比较结果
return true; // 如果所有位都相同,返回true
}
// 大数减法函数,计算 A - B,结果存储在 C 中
vector<int> sub(vector<int> &A, vector<int> &B)
{
vector<int> C; // 用于存储结果
for (int i = 0, t = 0; i < A.size(); i++) // t 表示借位
{
t = A[i] - t; // 先减去借位
if (i < B.size()) t -= B[i]; // 如果 B 还有位数,减去 B 的当前位
C.push_back((t + 10) % 10); // 将当前位的差值存入 C(处理负数情况)
if (t < 0) t = 1; // 如果差值为负,需要借位
else t = 0; // 否则不需要借位
}
while (C.size() > 1 && C.back() == 0) C.pop_back(); // 去掉结果中的前导0
return C;
}
int main()
{
cin >> a >> b; // 输入两个大数
// 将字符串形式的大数转换为vector,并逆序存储(方便计算)
for (int i = a.size() - 1; i >= 0; i--) A.push_back(a[i] - '0');
for (int i = b.size() - 1; i >= 0; i--) B.push_back(b[i] - '0');
// 比较 A 和 B 的大小
if (cmp(A, B)) // 如果 A >= B
{
auto C = sub(A, B); // 计算 A - B
for (int i = C.size() - 1; i >= 0; i--) cout << C[i]; // 输出结果
}
else // 如果 A < B
{
auto C = sub(B, A); // 计算 B - A
cout << "-"; // 输出负号
for (int i = C.size() - 1; i >= 0; i--) cout << C[i]; // 输出结果
}
return 0;
}
【运行结果】
2
1
1
浙公网安备 33010602011771号