[NOIP1999] 回文数 - 代码 - 做个记录
高精度加法 + 进制转换 + 回文数
#include <iostream>
#include <string>
#include <algorithm>
#include <cctype>
using namespace std;
const int N = 110;
// 构造反串
string fan(string& x) {
int p = x.size();
while(p > 1 && x[p - 1] == '0') p--;
string y = x.substr(0, p); // 去除后导零 // substr 少了个参数 pos - 坑 3
reverse(y.begin(), y.end()); // 忘记反转了 - 坑 4
return y;
}
// 判断是否为回文串
bool pd(string& x) {
string y = fan(x);
return x == y;
}
// n >= 2 && n <= 10 - 参数顺序写错了 - 坑 5
string add1(int c[], int a[], int b[], int lc, int la, int lb, string& x, string& y, int n) {
// 逆序存放
for(int i = 0; i < la; i++) a[la - 1 - i] = x[i] - '0';
for(int i = 0; i < lb; i++) b[lb - 1 - i] = y[i] - '0';
// 加法过程
for(int i = 0; i < lc; i++) {
c[i] += a[i] + b[i];
c[i + 1] += c[i] / n;
c[i] %= n;
}
// 最高位进一位
if(c[lc]) lc++;
// 转化为字符串返回 - 记得逆回来 // 忘记逆回来了 - 坑 1
string ret = "";
for(int i = lc - 1; i >= 0; i--) {
ret.push_back(c[i] + '0');
}
return ret;
}
// n == 16 - 参数顺序写错了 - 坑 5
string add2(int c[], int a[], int b[], int lc, int la, int lb, string& x, string& y, int n) {
// 逆序存放
for(int i = 0; i < la; i++) {
if(isdigit(x[i])) a[la - 1 - i] = x[i] - '0';
else a[la - 1 - i] = x[i] - 'A' + 10;
}
for(int i = 0; i < lb; i++) {
if(isdigit(y[i])) b[lb - 1 - i] = y[i] - '0';
else b[lb - 1 - i] = y[i] - 'A' + 10;
}
// 加法过程
for(int i = 0; i < lc; i++) {
c[i] += a[i] + b[i];
c[i + 1] += c[i] / n;
c[i] %= n;
}
// 最高位进一位
if(c[lc]) lc++;
// 转化为字符串返回 - 记得逆回来
string ret = "";
for(int i = lc - 1; i >= 0; i--) {
if(c[i] < 10) ret.push_back(c[i] + '0'); // c[i] < 10 写成了 c[i] <= 10 - 坑 6
else ret.push_back(c[i] - 10 + 'A');
}
return ret;
}
// 高精度加法 - 针对不同进制 - 返回字符串
string add(string& x, string& y, int n) {
int a[N] = {0}, b[N] = {0}, c[N] = {0};
int la = x.size(), lb = y.size(), lc = max(la, lb);
// n == 16 的情况要特判
if(n == 16) return add2(c, a, b, lc, la, lb, x, y, n);
return add1(c, a, b, lc, la, lb, x, y, n);
}
// 计算答案
int calc(string& x, int n) {
// 特判 x 为回文串的情况 - 忘记特判 - 坑 7
if(pd(x)) return 0;
string y = fan(x);
int ret = 0;
string t;
do { // 坑 2 实际上用 while () 也行
t = add(x, y, n);
ret++;
if(ret > 30) return -1;
x = t; y = fan(x); // 更新参数
} while(!pd(t));
return ret;
}
void solve() {
int n; cin >> n;
string x; cin >> x;
int ans = calc(x, n);
if(ans == -1) cout << "Impossible!" << endl;
else cout << "STEP=" << ans << endl;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
solve();
return 0;
}
查看12道真题和解析