题解 P4282 【[AHOI2008]计算器】
见贤思齐_Seakies · · 题解
题目链接
题意概述
现在有两个
题目分析
一看这道题,大家应该就会想到高精度,首先我们把它分为两种情况,第一种情况是计算和,第二种情况为计算差。
我们通过高精度,模拟题意,分别计算出和与差,最后输出,输出时要注意,最后一个数字后面没有空格。
那么我们如何计算和与差呢?
和:首先,我们先计算出每一位的和,然后,我们进行进位操作。
差:与和一样,先计算出差后,如果小于零,便不断地向高位借位,直到得到的数大于等于零为止。
注意:我们输入的时候是从高位开始的,所以,我们进行操作的时候要倒着循环。
详细解释请看代码:
代码
#include <bits/stdc++.h> // 万能头
using namespace std;
int n;
int x[100005], a[100005], b[100005], sum[100005]; // x 为进制,a 和 b 为两个变进制数,sum 记录和与差
/* ---------------------------------------------- */
void he() {
for (int i = n; i >= 1; i--) { // 注意要倒序
sum[i] += a[i] + b[i]; // 算和
a[i - 1] += sum[i] / x[i]; // 让下一位加上这一位多的数
// 注意:我们这里是倒序的,因此,上一位应是 i - 1,下面的减法也一样
sum[i] %= x[i]; // 当前这一位的和对进制取模
// 进位
}
} // 计算加法
void cha() {
for (int i = n; i >= 1; i--) {
sum[i] = a[i] - b[i]; // 算差
while (sum[i] < 0) { // 如果求出的差为负就不断借,直到大于零为止
// 注意:这里一定要用循环,不能只用一个 if,因为你只借一次可能不够用
a[i - 1]--; // 让上一位减一
sum[i] += x[i]; // 当前这一位加上借的这一位,借的数就是上一位的进制
} // 向高位借位
}
} // 计算减法
// 核心部分
/* ---------------------------------------------- */
int main() {
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> x[i];
}
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
char c;
cin >> c;
for (int i = 1; i <= n; i++) {
cin >> b[i];
}
// 输入
/* ---------------------------------------------- */
if (c == '+') {
he();
} else {
cha();
}
/* ---------------------------------------------- */
for (int i = 1; i < n; i++) {
cout << sum[i] << ' ';
} // 这里正序输出就可以了
cout << sum[n] << endl; // 注意:这里最后一个数的后面不能有空格
// 输出
return 0; // return 是个好习惯
} // ~ 完美结束!~
(别忘了开 O2)
于是,有的大佬就要问了,题目不是让你对
其实是不用的,
题目推荐
https://www.luogu.com.cn/problem/P1601
https://www.luogu.com.cn/problem/P1303
https://www.luogu.com.cn/problem/P1255
https://www.luogu.com.cn/problem/P1009
https://www.luogu.com.cn/problem/P1480
本蒟蒻第一次写题解,希望对大家有帮助!
最后再说一句,大家不要抄袭哦!