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

全部评论

相关推荐

合适才能收到offe...:招聘上写这些态度傲慢的就别继续招呼了,你会发现hr和面试官挺神的,本来求职艰难就可能影响一些心态了,你去这种公司面试的话,整个心态会炸的。
点赞 评论 收藏
分享
评论
1
1
分享

创作者周榜

更多
正在热议
更多
# 春招至今,你的战绩如何? #
10468次浏览 92人参与
# 你的实习产出是真实的还是包装的? #
1848次浏览 42人参与
# MiniMax求职进展汇总 #
23989次浏览 308人参与
# 军工所铁饭碗 vs 互联网高薪资,你会选谁 #
7554次浏览 43人参与
# 简历第一个项目做什么 #
31654次浏览 334人参与
# 重来一次,我还会选择这个专业吗 #
433430次浏览 3926人参与
# 巨人网络春招 #
11323次浏览 223人参与
# 当下环境,你会继续卷互联网,还是看其他行业机会 #
187091次浏览 1122人参与
# 牛客AI文生图 #
21422次浏览 238人参与
# 不考虑薪资和职业,你最想做什么工作呢? #
152343次浏览 888人参与
# 研究所笔面经互助 #
118893次浏览 577人参与
# 简历中的项目经历要怎么写? #
310201次浏览 4208人参与
# AI时代,哪些岗位最容易被淘汰 #
63614次浏览 817人参与
# 面试紧张时你会有什么表现? #
30503次浏览 188人参与
# 你今年的平均薪资是多少? #
213067次浏览 1039人参与
# 你怎么看待AI面试 #
180017次浏览 1249人参与
# 高学历就一定能找到好工作吗? #
64324次浏览 620人参与
# 你最满意的offer薪资是哪家公司? #
76480次浏览 374人参与
# 我的求职精神状态 #
448036次浏览 3129人参与
# 正在春招的你,也参与了去年秋招吗? #
363361次浏览 2638人参与
# 腾讯音乐求职进展汇总 #
160633次浏览 1111人参与
# 校招笔试 #
470822次浏览 2964人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务