题目描述详见Luogu P1015 回文数
需要进行N进制的加法,十进制及以下的好说,但十六进制略恶心了。于是还是想到了强大的STL,用vector算高精。有了vector,那么是否回文数也好判断了,从头尾同时进行遍历,判断。对于十六进制,直接读入的时候处理一下,读到A到F直接存成相应的十进制数就好了。
#include<iostream>
#include<cstdio>
#include<vector>
#include<algorithm> // 运用reverse函数
int N = 0;
std::vector<int> v1, v2; // v1存M,v2存v1倒序
void read(void); //读入v1
void solve(void);
void add(std::vector<int>&, std::vector<int>&, const int&); //N进制加法,结果存入v1
bool is_pali(const std::vector<int>&); //判断是否回文数
int main() {
solve();
return 0;
}
void read(void) { //改造自读入优化
char ch =getchar();
while (!isalnum(ch))
ch = getchar();
while (isdigit(ch) || (ch >= 'A' && ch <= 'F')) {
if (ch >= 'A' && ch <= 'F') //存入相应十进制数
v1.push_back(10+ch-'A');
else
v1.push_back(ch-'0');
ch = getchar();
}
reverse(v1.begin(), v1.end()); //倒序存储
}
void solve(void) {
using namespace std;
scanf("%d", &N);
read();
int countn = 0;
while (!is_pali(v1) && countn <= 30) {
v2 = v1;
reverse(v2.begin(), v2.end());
add(v1, v2, N);
countn++;
}
if (countn <= 30)
printf("STEP=%d", countn);
else
printf("Impossible!");
}
void add(std::vector<int>& v1, std::vector<int>& v2, const int& N) {
int len = v1.size();
int x = 0;
for (int i=0; i<len; i++) {
v1[i] += (v2[i]+x);
x = v1[i]/N;
v1[i] %= N;
}
if (x != 0) {
v1.push_back(x); //因为v1倒序存储,故若有进位,push_back即可
}
return;
}
bool is_pali(const std::vector<int>& v1) {
for (int i=0, j=v1.size()-1; i<j; i++, j--) {
if (v1[i] != v1[j])
return false;
}
return true;
}