P4282--高精度加减,进制
#include <bits/stdc++.h>
using namespace std;
typedef long long ll ;
const long long INF = 1e18;
const int MOD = 1e9 + 9; // 定义模数
int a[100111];
int b[100111];
int w[100111];
int aa[100111];
int bb[100111];
int n;
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n;
for(int i=0;i<n;i++)
{
cin>>w[i];
}
for(int i=0;i<n;i++)
{
cin>>a[i];
}
int f=0;
char op;
cin>>op;
if(op=='+') f=1;
for(int i=0;i<n;i++)
{
cin>>b[i];
}
for(int i=0;i<n;i++)
{
aa[n-i-1]=a[i];
}
for(int i=0;i<n;i++)
{
bb[n-1-i]=b[i];
}
if(f)
{
int c[200111];
int cc[200111];
for(int i=0;i<n;i++)
{
c[i]=bb[i]+aa[i];
}
int co=0;
for(int i=0;i<n;i++)
{
int s=(co+c[i])%w[n-i-1];
co=(co+c[i])/w[n-1-i];
cc[i]=s;
}
for(int i=n-1;i>=0;i--)
{
if(!i) cout<<cc[i];
else cout<<cc[i]<<" ";
}
}else
{
int c[200111];
int cc[200111];
for (int i =0; i<n; i++) {
c[i] = aa[i] - bb[i]; // 算差
while (c[i] < 0) { // 如果求出的差为负就不断借,直到大于零为止
// 注意:这里一定要用循环,不能只用一个 if,因为你只借一次可能不够用
aa[i + 1]--; // 让上一位减一
c[i] += w[n-i-1]; // 当前这一位加上借的这一位,借的数就是上一位的进制
}
}// 向高位借位
for(int i=n-1;i>=0;i--)
{
if(!i) cout<<c[i];
else cout<<c[i]<<" ";
}
}
return 0;
}