题目描述
小丽同学在编程中学到了回文数的概念,如果一个数正过来读和反过来读是同一个数,那么这个数就是回文数;比如:22、55、88、6666、121121、686686、1232112321 都是回文数,小丽发现,这样的数不算多。
于是小丽有个想法,如果这个数不是回文数,但这个数在 22 进制或者 1616 进制下是回文数,就算这个整数是半个回文数,比如 417417 并不是回文,但 417 对应的 16 进制数是 1A1 是回文数,因此 417 算半个回文数。
请你编程帮助小丽找符合条件的半个回文数。
输入
第一行是一个整数 n(5≤n≤100); 第二行是 n 个整数(这些整数都是[0,108] 之间的整数);
输出
所有符合条件的半个回文数,每行一个。
样例
输入
5
121 417 27 100 21
输出
417
27
21
思路:
1、函数部分:
定义函数,先将n
转换成d
进制。
int x=0;
char c;
string s;
while(n!=0){//将n转换成d进制
x=n%d;
if(x<10) c=x+'0';
else c=x+'A'-10;
s=c+s;
n=n/d;
}
再判断这个d
进制的数是否是回文的,如果不是,直接return 0
或return false
,是,return 1
或return true
。
for(int i=0;i<s.size();i++){//循环判断是否为回文
if(s[i]!=s[s.size()-i-1]){
return 0;
}
}
return 1;
函数部分完整代码:
bool fun(int n,int d){
int x=0;
char c;
string s;
while(n!=0){//将n转换成d进制
x=n%d;
if(x<10) c=x+'0';
else c=x+'A'-10;
s=c+s;
n=n/d;
}
for(int i=0;i<s.size();i++){//循环判断是否为回文
if(s[i]!=s[s.size()-i-1]){
return 0;
}
}
return 1;
}
2、主函数部分:
1、读入,这句话是不是多余的
cin>>n;
for(int i=0;i<n;i++){
cin>>x;
}
2、边读入每一个数x
边判断,
条件1:x
在10进制下不是回文数(满足半个回文数的条件)。
if(!fun(x,10))
条件2:
分两种情况:
情况1:x
在2进制中是回文数。
情况2:x
在16进制中是回文数。
这两种情况满足一种即可。
if(!fun(x,10)&&(fun(x,2)||fun(x,16)))
3、满足条件,输出x
。
if(!fun(x,10)&&(fun(x,2)||fun(x,16))){
cout<<x<<endl;
}
主函数部分完整代码:
int n,x;
int main(){
cin>>n;
for(int i=0;i<n;i++){
cin>>x;
if(!fun(x,10)&&(fun(x,2)||fun(x,16))){
cout<<x<<endl;
}
}
return 0;
}
完整代码:
#include <bits/stdc++.h>
using namespace std;
bool fun(int n,int d){
int x=0;
char c;
string s;
while(n!=0){//将n转换成d进制
x=n%d;
if(x<10) c=x+'0';
else c=x+'A'-10;
s=c+s;
n=n/d;
}
for(int i=0;i<s.size();i++){//循环判断是否为回文
if(s[i]!=s[s.size()-i-1]){
return 0;
}
}
return 1;
}
int n,x;
int main(){
cin>>n;
for(int i=0;i<n;i++){
cin>>x;
if(!fun(x,10)&&(fun(x,2)||fun(x,16))){
cout<<x<<endl;
}
}
return 0;
}