题目传送门
思路:
1.转化、进行乘方和判断回文的顺序
由于在非十进制数上进行乘方比较困难,所以我们要先转化,再乘方,最后判断回文。
2.转化
直接转化即可,注意特判十到十九的情况。
代码:
string zhuan(int a,int jinzhi){
string ans;
while(a){
int s=a%jinzhi;
//cerr<<a<<" ";
a/=jinzhi;
if(s==10)ans='A'+ans;
else if(s==11)ans='B'+ans;
else if(s==12)ans='C'+ans;
else if(s==13)ans='D'+ans;
else if(s==14)ans='E'+ans;
else if(s==15)ans='F'+ans;
else if(s==16)ans='G'+ans;
else if(s==17)ans='H'+ans;
else if(s==18)ans='I'+ans;
else if(s==19)ans='J'+ans;
else ans=char(s+48)+ans;
}
return ans;
}
3.判断回文
由于本题中有十一到二十进制的数,所以判断回文时不能用int类型的数组,而要用string
代码:
for(int j=rns.length()-1;j>=0;j--){
bns+=rns[j];
}if(rns==bns){
cout<<dns<<" "<<rns<<endl;
}
完整代码:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<iomanip>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
int n;
string zhuan(int a,int jinzhi){
string ans;
while(a){
int s=a%jinzhi;
//cerr<<a<<" ";
a/=jinzhi;
if(s==10)ans='A'+ans;
else if(s==11)ans='B'+ans;
else if(s==12)ans='C'+ans;
else if(s==13)ans='D'+ans;
else if(s==14)ans='E'+ans;
else if(s==15)ans='F'+ans;
else if(s==16)ans='G'+ans;
else if(s==17)ans='H'+ans;
else if(s==18)ans='I'+ans;
else if(s==19)ans='J'+ans;
else ans=char(s+48)+ans;
}
return ans;
}int main(){
cin>>n;
for(int i=1;i<=300;i++){
int ans=i*i;
string dns=zhuan(i,n);
string rns=zhuan(ans,n);
string bns;
for(int j=rns.length()-1;j>=0;j--){
bns+=rns[j];
}if(rns==bns){
cout<<dns<<" "<<rns<<endl;
}
}
return 0;
}