【蓝桥杯】X 进制减法

【蓝桥杯】X 进制减法_第1张图片

难点一:base = base * s[i] % mod;//***当前位乘以x,x要*=s[i],一直要乘到个位的进制

难点二:当当前该位的的进制位,为max(max(a[i]+1, b[i]+1), 2)的时候,结果最小

ACcode:

#include

using namespace std;

const int mod = 1000000007;//模

int a[100005], b[100005], s[100005],n;//A,B,从个开始的每一位的进制

int main()

{

cin >> n;

cin >> a[0];//A一共有几位

for (int i = a[0]; i >= 1; i--)cin >> a[i];//输入A的每一位

cin >> b[0];//B一共有多少位

for (int i = b[0]; i >= 1; i--)cin >> b[i];//输入B的每一位

int mx = max(a[0], b[0]);//找出A,B中的做高位是几位

for (int i = 1; i <= mx; i++)//根据计算推导发现:

//当当前该位的的进制位,为max(max(a[i]+1, b[i]+1), 2)的时候,结果最小

s[i] = max(max(a[i]+1, b[i]+1), 2);//最小为二进制

//模拟减法

long long base = 1, ans = 0;//从个位开始进制还原

//base****************

for (int i = 1; i <= mx;i++)//一位一位处理

{

if (a[i] >= b[i])ans = ans + (a[i] - b[i]) * base % mod;

else//a[i]

{

a[i + 1]--;//先前借位

a[i] += s[i];//借好了就加上

ans = ans + base * (a[i] - b[i]) % mod;

}

ans %= mod;

base = base * s[i] % mod;//***当前位乘以x,x要*=s[i],一直要乘到个位的进制

}

cout << ans << endl;//输出

return 0;//结束(好习惯)

}

你可能感兴趣的:(蓝桥杯,c++,算法)