1.3.4 回文平方
题目考查
字符串和数字相互转化, 进制转换, 判断回文数字
解题思路
首先我们理清我们都需要实现哪些操作:
- 把一个十进制数字转化为B进制
- 判断一个数字是否为回文数字
对于十进制转化为B进制: 我们只需要模拟以前学的"短除法"即可, 最后把得到的数字逆序后即为所求.
对于判断数字是否是回文数字: 对于一个int类型而言, 判断这个数字是否回文是很不方便的. 我们通常的做法就是把它转换成字符串类型, 然后模拟我们人脑判断的方式即可.
题目细节
C++内部实现了string类型, 和char[]类型相比, 真是有好有坏. 我们可以借助这个题稍微谈两点.
-
to_string()函数, 可以把一个整型, 浮点型转换成string类型. 如:
string s = to_string(num)
那如果我想把一个string转换成回去呢?
很遗憾, string本身没有实现这样的功能, 但是c语言中的char[] 可以做到字符串到整型的变换.
我们可以通过atoi()函数, 把一个char数组转换成int类型.
int num = atoi(s)
比较幸运的是, c++为了让string向下兼容, 提供了一个c_str()函数, 可以把string转换成char[]来用.
int num = atoi(s.c_str())
因此我们可以用这样的方式把string转回int类型. -
回文数字的判断, 我们比较笨的方法就是采用双指针去前后扫描一遍. 但本题回文数字的长度不会很长, 我们可以采用一种更暴力的来判断. 直接判断字符串翻转前后是否相同即可.
-
进制转换的过程中, 为了避免数字0的情况, 我们应当采用do-while循环(其实很多对数位有关的操作我都推荐用do-while).
AC代码
#include <bits/stdc++.h>
#define rep(i, n) for (int i = 1; i <= (n); ++i)
using namespace std;
typedef long long ll;
char getc(int x) { return x < 10 ? '0' + x : 'A' + x - 10; }
string fact(int x, int b) {
string s;
do {
s += getc(x % b);
x /= b;
} while (x);
reverse(s.begin(), s.end());
return s;
}
int main()
{
int b; cin >> b;
rep(i, 300) {
string s = fact(i * i, b);
string t = s;
reverse(t.begin(), t.end());
if (s == t) printf("%s %s\n", fact(i, b).c_str(), s.c_str());
}
return 0;
}