1361: 【基础】小丽找半个回文数(1386)

内存限制:16 MB 时间限制:1.000 S
评测方式:文本比较 命题人:
提交:2 解决:2

题目描述

小丽同学在编程中学到了回文数的概念,如果一个数正过来读和反过来读是同一个数,那么这个数就是回文数;比如:2、5、8、66、121、686、12321都是回文数,小丽发现,这样的数不算多。于是小丽有个想法,如果这个数不是回文数,但这个数在2进制或者16进制下是回文数,就算这个整数是半个回文数,比如417并不是回文,但417对应的16进制数是1A1是回文数,因此417算半个回文数。
请你编程帮助小丽找符合条件的半个回文数。

输入

第一行是一个整数n(10<=n<=100)
第二行是n个整数(这些整数都是0~999999999之间的整数)

输出

所有符合条件的半个回文数,每行一个。

样例输入 复制

5
121 417 27 100 21

样例输出 复制

417
27
21

提示

#include<bits/stdc++.h>
using namespace std;
/*
如果这个数在10进制下不是回文数
但这个数在1进制或者16进制下是回文数 
*/
/*
判断整数n在d进制下是否是回文
除d对d取余数,将余数存入数组,判断数组是否是回文 
*/ 
bool huiwen(int n,int d){
	bool r=true; //假设是回文 
	int a[1000]={0}; //初始化为0,存n转d进制后的每一位 
	int k=0;
	while(n!=0){
		a[k]=n%d;
		k++;
		n=n/d;
	}
	//判断回文:循环数组长度一半,判断对称位置是否有不等 
	for(int i=0;i<k/2;i++){
		if(a[i]!=a[k-i-1]){
			r=false;
			break;
		}
	}
	return r;
}
int main(){
    int a[110],n,i;
    cin>>n;
    //遍历每个数,判断是否是半个回文 
    for(i=0;i<n;i++){
    	cin>>a[i];
	}
	for(i=0;i<n;i++){
		if(huiwen(a[i],10)==false&&(huiwen(a[i],2)==true||huiwen(a[i],16)==true)){
			cout<<a[i]<<endl;
		}
	}
	return 0;
}