题目描述 我们把从左往右和从右往左念起来相同的数字叫做回文数。例如,75457就是一个回文数。 当然某个数用某个进制表示不是回文数,但是用别的进制表示可能就是回文数。 例如,17是用十进制表示的数,显然它不是一个回文数,但是将17用二进制表示出来是10001,显然在二进制下它是一个回文数。 现在给你一个用十进制表示的数,请你判断它在2~16进制下是否是回文数。
输入 输入包含多组测试数据。每组输入一个用十进制表示的正整数n(0<n<50000),当n=0时,输入结束。
输出 对于每组输入,如果n在216进制中的某些进制表示下是回文数,则输出“Number i is palindrom in basis ”,在后面接着输出那些进制。其中i用n的值代替,后面输出的进制中,每两个数字之间空一个。 如果n在216进制的表示下都不为回文数,则输出“Number i is not a palindrom”,其中i用n的值代替。
样例输入
样例输出 1 2 Number 17 is palindrom in basis 2 4 16 Number 19 is not a palindrom
思路 主要问题:
使用什么样的数据类型
进制的转换
回文数的判断
解决方案:
这里不可以用int之类的类型来存储,因为50000的二进制高达16位 ,所以要用数组来存储进制转换后的数据
进制的转换
1 2 3 4 5 6 7 int aim[20 ];int lenth = 0 ; while (n) { aim[lenth++] = n%i; n/=i; }
回文数判断的两种思路(因为我们使用了数组,所以采用第二种方案)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 bool is_palindromic (int num) { int ans=0 ,copy=num; while (copy) { ans*=10 ; ans+=copy%10 ; copy/=10 ; } return ans==num?true :false ; } bool is_palindromic (string s) { int l=0 ,r=s.length()-1 ; while (l<=r) { if (s[l++]==s[r--]) continue ; else return false ; } return true ; }
程序主干:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 int main () { unsigned int n; bool flag; int i; while (true ){ cin >> n; if (n==0 ) break ; flag = false ; for (i=2 ;i<=16 ;i++){ if (judge(n,i)==true ){ if (flag==false ){ cout << "Number " <<n<<" is palindrom in basis " << i; flag = true ; }else { cout << " " << i; } } } if (flag == false ) cout << "Number " << n <<" is not a palindrom" ; cout << endl ; } }
题解 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 #include <iostream> using namespace std ;bool judge (unsigned int n,int i) { int aim[20 ]; int lenth = 0 ; while (n) { aim[lenth++] = n%i; n/=i; } int l=0 ,r=lenth-1 ; while (l<=r){ if (aim[l++]==aim[r--])continue ; else return false ; } return true ; } int main () { unsigned int n; bool flag; int i; while (true ){ cin >> n; if (n==0 ) break ; flag = false ; for (i=2 ;i<=16 ;i++){ if (judge(n,i)==true ){ if (flag==false ){ cout << "Number " <<n<<" is palindrom in basis " << i; flag = true ; }else { cout << " " << i; } } } if (flag == false ) cout << "Number " << n <<" is not a palindrom" ; cout << endl ; } }