Day5 1346. 回文平方(进制处理 回文判断)

AC代码

#include<iostream>
#include<algorithm>
#include<cstring>

using namespace std;

char getc(int x){      ///数转字母
    if(x<10)
        return '0'+x;
    else
        return 'A'+x-10;
}
string base(int x,int b){     ///短除法把x以b进制表示
    string num;
    while(x){
        int y=x/b;    ///求商
        num+=getc(x-y*b);   ///把余数转化为字母追加到结果
        x=y;
    }
    reverse(num.begin(),num.end());     ///短除法要倒置才是正确结果
    return num;
}
bool check(string num){
    for(int i=0,j=num.size()-1;i<j;++i,--j)   ///双指针法判断回文
        if(num[i]!=num[j])
            return false;
    return true;
}

int main(){
    int b;
    cin>>b;
    for(int i=1;i<=300;++i){
        string num = base(i*i,b);
        if(check(num))
            cout<<base(i,b)<<" "<<base(i*i,b)<<endl;
    }
    return 0;
}

方法技巧

  1. 从10进制转化到b进制,使用短除法进行转换
  2. 用双指针快速判断回文
  3. 巧妙利用char和int的加减法实现将某位转化为字母

相关算法

将b进制数转化为10进制,使用秦九韶算法较为方便实现

#include<iostream>
#include<cstring>
#include<algorithm>

using namespace std;

int getu(char c){        ///字母转数
    if(c>='0'&&c<='9')
        return c-'0';
    else
        return 10+c-'A';
}
int base10(string num,int b){
    int res=0;
    for(auto c:num){   ///枚举每一位
        res=res*b+getu(c);      ///秦九韶算法迭代过程
    }
    return res;
}

int main(){
    string num;
    int b;
    cin>>num>>b;   ///输入数字与进制
    cout<<base10(num,b)<<endl;   ///得到十进制结果
    return 0;
}

相关题目

AcWing 124. 数的进制转换

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值