题目描述
回文数是指数字从前往后读和从后往前读都相同的数字。
例如数字 12321
就是典型的回文数字。
现在给定你一个整数 B
,请你判断 1∼300 之间的所有整数中,有哪些整数的平方转化为 B 进制后,其 B 进制表示是回文数字。
输入样例
10
输出样例
1 1
2 4
3 9
11 121
22 484
26 676
101 10201
111 12321
121 14641
202 40804
212 44944
264 69696
(暴力枚举)
做这道题无非就两个问题
1、十进制转化成其他进制
2、判断回文数
进制转化 当时做这道题的时候第一思路就是想用栈
回文数的话之前在力扣上做过一道回文数的题 在这里参考下即可
用string中的翻转函数 只要翻转回来和之前一样就是回文数 否则不是
C++ 代码
#include <iostream>
#include <algorithm>
#include <stack>
using namespace std;
// 转化进制 最后用string返回
string trans(int x, int b)
{
string str = "";
stack<int> stk;
while (x)
{
stk.push(x % b);
x /= b;
}
while (!stk.empty())
{
if (stk.top() >= 0 && stk.top() <= 9)
str += (stk.top() + '0');
else str += (stk.top() + '7'); // 和下面两者写法都可以
// 因为有16进制 所以需要讨论
// else str += (stk.top() - 10 + 'A');
stk.pop();
}
return str;
}
// 判断回文数
bool isH(int x, int b)
{
string s = trans(x, b);
return s == string(s.rbegin(), s.rend());
}
int main()
{
int B;
cin >> B;
for (int i = 1; i <= 300; i ++ )
{
if (isH(i * i, B))
{
string s1 = trans(i, B);
string s2 = trans(i * i, B);
cout << s1 << " " << s2 << endl;
}
}
return 0;
}