P4282 题解
作为一道模板题,某蒟蒻认为难度系数不大。
题目描述:
- 一个整数
N ,表示计算器的长度。 -
- 两个分别是长度为
N 的运算数。 - 一个运算符,表示要实现的运算。
- 你需求出两个运算数经过运算后的值。
-
主要思想:
看到
在计算出结果后,我们需要对一个数 其实是我不愿意写
) 所以我找到了一个可以巧妙避免取模的方法那就是:
直接输出 N 位的值。
一个小坑点: 输入的数应该需要 reverse 一下。
至于如何不取模,以下给出证明。
已知
当运算符为加时: 如果两个运算数的和大于了
当运算符为减时: 如果两个运算数的差小于0,根据取模的性质:一个负数模一个正数答案也会是正数,所以答案也只输出
#include <bits/stdc++.h>
#define in scanf
#define out printf
using namespace std;
int x[100005];
int a[100005];
int b[100005];
int c[100005];
int number,mod,sum;
char op;
int main(){
in("%d",&number);
//原来都是正着输入的,可是因为我懒,都改成倒着输入了
for(int rp=number;rp>=1;rp--){
in("%d",&x[rp]);
}
for(int rp=number;rp>=1;rp--){
in("%d",&a[rp]);
}
cin>>op; //此处是一个坑点:假如你用scanf就会多读一个空格
for(int rp=number;rp>=1;rp--){
in("%d",&b[rp]);
}
// 到此为止都是输入
if(op=='+'){
// 当运算符是+时,执行加法操作
for(int rp=1;rp<=number;rp++){
c[rp]=(a[rp]+b[rp]+sum)%x[rp];
sum=(a[rp]+b[rp]+sum)/x[rp];
/*
十进制高精:
c[rp]=(a[rp]+b[rp]+sum)%10;
sum=(a[rp]+b[rp]+sum)/10;
相比之下,就是把进制改成了x[rp]进制
*/
}
}else{
for(int rp=1;rp<=number;rp++){//减法操作
if(a[rp]<b[rp]){
a[rp]+=x[rp];
a[rp+1]--;
}
a[rp]-=b[rp];
c[rp]=a[rp];
// 同样把十进制改为了x[rp]进制
}
}
for(int rp=number;rp>=1;rp--){-
out("%d ",c[rp]); // 输出答案c数组
}
return 0;
}
蒟蒻的第一篇题解,管理员大大求过qwq