由回文平方讲一种无脑转进制的方法


回文平方


回文数是指数字从前往后读和从后往前读都相同的数字。

例如数字 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,除此之外就没有什么了。


文章作者: 罗林
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 罗林 !
  目录