A number that reads the same from right to left as when read from left to right is called a palindrome. The number 12321 is a palindrome; the number 77778 is not. Of course, palindromes have neither leading nor trailing zeroes, so 0220 is not a palindrome.
The number 21 (base 10) is not palindrome in base 10, but the number 21 (base 10) is, in fact, a palindrome in base 2 (10101).
Write a program that reads two numbers (expressed in base 10):
Solutions to this problem do not require manipulating integers larger than the standard 32 bits.
A single line with space separated integers N and S.
3 25
26 27 28
先说一下解体思路,我用得最简单方法,从输入的S+1开始,每次将这个数先转换进制,然后将进行转换后的数进行回文判断,如果回文超过两次,那么输入,S+1 again,再去转换,判断,直到输出满足条件的N个数为止,
代码如下:
#include<iostream> #include<cstdio> #include<cstring> #define maxn 15 using namespace std; int dual(int* a,int len) //判断是否为回文数 { int fl=1; for(int i=0;i<=len;i++) { if(a[i]!=a[len]) {fl=0;break;} len--; } return fl; } int base_trans(int n,int* a,int base) //进行进制转换,并求出转换后的数组长度 { int fl=0; while(n) { a[fl++]=n%base; n/=base; } return fl; } int main() { freopen("dualpal.in","r",stdin); freopen("dualpal.out","w",stdout); int N,S,count=0; scanf("%d %d",&N,&S); for(int i=S+1;;i++) { int tr[maxn];//转换过进制的数 int time=0; //统计回文次数 for(int j=2;j<=10;j++) { memset(tr,0,sizeof(tr)); int len=base_trans(i,tr,j);//进行进制转换,并求出转换后的长度 if(dual(tr,len-1)) time++; //如果当前进制是回文数,次数加以,然后进行下一进制转换 if(time>=2) {printf("%d\n",i);count++;break;}//如果两次都是回文数,输出,count+1,然后进行下一个数 } if(count>=N) break; //输出够N个数了,就跳出 } return 0; }