ZOJ 1078 Palindrom Numbers

原题链接

题目大意:判断一个数是不是palindrom。不限于十进制,可以在任何进制下判断。

解法:还好,数字的范围不大,int类型足够搞定。方法就是从2进制开始,先把数字转换成2进制,判断是否对称,然后转换成3进制,直到16进制。这里的进制转换方法可以留意一下。

参考代码:

#include<iostream>

using namespace std;
bool isPalindrom(int, int);

int main(){
	int i,n;
	
	while(cin>>n&&n!=0){
		bool base[17]={false}, flag=false;;
		for(i=2;i<=16;i++){
			if(isPalindrom(n,i)==true){
				base[i]=true;
				flag=true;
			}
		}
		if(flag){
			cout<<"Number "<<n<<" is palindrom in basis";
			for(i=2;i<=16;i++){
				if(base[i])
					cout<<' '<<i;
			}
			cout<<endl;
		}else{
			cout<<"Number "<<n<<" is not a palindrom"<<endl;
		}
	}

	return 0;
}

bool isPalindrom(int n,int base){
	char s[16];
	int j=0,k;
	
	while(n!=0){      //十进制到任意进制的转换
		s[j]='0'+n%base;
		n/=base;
		j++;
	}
	for(k=0;k<j/2;k++){
		if(s[k]==s[j-k-1])
			continue;
		else
			return false;
	}
	return true;
}