回文平方
回文数是指数字从前往后读和从后往前读都相同的数字。
例如数字 12321 就是典型的回文数字。
现在给定你一个整数 B,请你判断 1∼300之间的所有整数中,有哪些整数的平方转化为 B 进制后,其 B 进制表示是回文数字。
输入格式
一个整数 B。
输出格式
每行包含两个在 B 进制下表示的数字。
第一个表示满足平方值转化为 B 进制后是回文数字那个数,第二个数表示第一个数的平方。
所有满足条件的数字按从小到大顺序依次输出。
数据范围
2≤B≤20,
对于大于 9 的数字,用 A 表示 10,用 B 表示 11,以此类推。
输入样例:
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
思路比较简单,这里主要讲一种无脑转进制的方法。
先贴代码
#include
using namespace std ;
int B ;
string a = "0123456789ABCDEFGHIJK" ;
string tob(int sum)
{
string res = "" ;
while(sum)
{
res += a[sum%B] ;
sum /= B ;
}
reverse(res.begin(), res.end()) ;
return res ;
}
bool check(string a)
{
int l = 0 ;
int r = a.size() -1 ;
while(l < r)
{
if(a[l] == a[r])
{
l ++ ; r -- ;
}
else
{
return false ;
}
}
return true ;
}
int main()
{
cin >> B ;
for(int i = 1 ; i <= 300 ; ++i)
{
string x = tob(i*i) ;
if(check(x))
{
string y = tob(i) ;
cout << y << " " << x << endl ;
}
}
return 0 ;
}
这里可以注意到,我在将任意数转换成B进制的时候,直接采用了一种比较万能的方法,直接将备选的string组给展示出来。然后就直接可以套用模板来进行转换了。如果最后是要用int型的,直接调用atoi函数即可。
例如,leetcode的一道题目:
405. 数字转换为十六进制数 - 力扣(LeetCode) (leetcode-cn.com)
class Solution {
public:
string toHex(int num) {
string a = "0123456789ABCDEF" ;
long long n = num < 0 ? (long long) (num + pow(2,32)) : num ;
string res = "" ;
while(n)
{
res += a[n%16] ;
n /= 16 ;
}
reverse(res.begin() , res.end()) ;
return res ;
}
};
特别要注意的是,当负数要进行进制转换的时候,因为要按照补码进行运算,就是再十进制基础上,加上了pow(2,32) 。但是同时也要注意,会不会爆int,因为int的范围是2的-31~2的31,直接加上pow(2,32)就会爆int ,所以我们需要有一个强制转换,ok,除此之外就没有什么了。