[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;
}

全部评论

相关推荐

03-27 17:33
门头沟学院 Java
代码飞升:同学院本,你要注意hr当天有没有回复过,早上投,还要打招呼要推销自己,不要一个劲投
点赞 评论 收藏
分享
评论
1
1
分享

创作者周榜

更多
牛客网
牛客企业服务