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;
}
方法技巧
- 从10进制转化到b进制,使用短除法进行转换
- 用双指针快速判断回文
- 巧妙利用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. 数的进制转换