AcWing 1346. 回文平方 注释详解
原题链接
简单
作者:
CarpeDime
,
2021-01-13 20:48:13
,
所有人可见
,
阅读 488
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
/**
* char get(int x) 把数字转换为字符
* @param x 为数字
* @return 返回转换好的数据
*/
char get(int x) {
// 数字大小小于等于9时就加上0,可以看作把字符0为基坐标,x为偏移量
if (x <= 9) return x + '0';
// 如果数字大于9那么一定大于等于10, 那么就把字符A看作基坐标,10-x为偏移量,
// 这样就可以确定比9大的数据
return x - 10 + 'A';
}
/**
* string base(int n, int b)函数为构造一个B进制的数据
* @param n 是数据范围(1~300)的平方
* @param b 是进制
* @return res 返回一个string类型的数据
*/
string base(int n, int b) {
string res;
// 构造一个B进制数,先把通过循环找出每一位数
while (n) res += get(n % b), n /= b;
// 由于时按照字符存储,去数字又是倒叙所以需要对字符串反转
reverse(res.begin(), res.end());
return res;
}
/**
* bool check(string s)
* @param s 检查构造好的数字
* @return true 如果是回文就返回true
*/
bool check(string s) {
// 采用双指针算法,判断两头是否相等
for (int i = 0, j = s.size() - 1; i < j; -- j, ++ i) {
if (s[i] != s[j]) return false;
}
return true;
}
int main() {
int b;
scanf("%d", &b);
for (int i = 1; i <= 300; ++ i) {
// 1.构造B进制的数字
string num = base(i * i, b);
// 2.检查该数字是否为回文数
if (check(num)) {
// 由于使用string这个类,对于printf来所不能直接打印
// 需要使用c_str()函数把string转换
printf("%s %s\n", base(i, b).c_str(), num.c_str());
}
}
return 0;
}