题目链接:https://codeforces.com/contest/1144/problem/E
题意:现在有两个二十六进制的数字a和b,ab都是用小写字母表示的,现在要你打印出(a + b) / 2。保证肯定存在整数答案。
解题心得:直接当高精度处理,一个高精度±/的综合。这样处理起来也比较简单,因为ab的长度相等,保证有答案。
#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5+100;
typedef pair<int,int> P;
char s[2][maxn];//两个高精度输入数
int num[2][maxn], n;//将字符串转化成整形
int ans[maxn];//记录答案
void init() {
scanf("%d", &n);
scanf("%s%s", s[0], s[1]);
for(int w=0;w<2;w++){
for(int i=0;i<n;i++) {
num[w][i] = s[w][i] - 'a';
}
}
}
void div() {
int last = 0;
for(int i=0;i<n;i++) {
int now = last + ans[i];
ans[i] = now/2;
if(now%2 == 1) {
last = 26;
} else {
last = 0;
}
}
}
void cut() {
int borrow = 0;
for(int i=n-1;i>=0;i--) {
if(num[1][i] + borrow < num[0][i]) {
ans[i] = num[1][i] - num[0][i] + borrow + 26;
borrow = -1;
} else {
ans[i] = num[1][i] + borrow - num[0][i];
borrow = 0;
}
}
}
void add() {
int up = 0;
for(int i=n-1;i>=0;i--) {
int temp = ans[i] + up + num[0][i];
ans[i] = temp % 26;
up = temp / 26;
}
}
void Print() {
for(int i=0;i<n;i++) {
printf("%c", ans[i]+'a');
}
}
int main() {
// freopen("1.in", "r", stdin);
init();
//ans = a + (a+b)/2
cut();
div();
add();
Print();
return 0;
}