如果一个正整数n至少在两个不同的进位制b1、b2下都是回文数(2 <= b1, b2 <= 10),则称n为双基回文数(注意:回文数不能包含前导0)。输入正整数S < 10^6,输出比S大的最小双基回文数。
1 #include <cstdio> 2 #include <iostream> 3 #include <string.h> 4 #include <math.h> 5 using namespace std; 6 bool change(int n,int b) 7 { 8 char sum[100]; 9 int i=0; 10 while(1) 11 { 12 if(n<b) 13 {sum[i++]=‘0‘+n;sum[i]=‘\0‘; break;} 14 sum[i++]=n%b+‘0‘; 15 n/=b; 16 } 17 int l=strlen(sum); 18 int ok=1; 19 for(int j=0;j<l/2;j++) 20 { 21 if(sum[j]!=sum[l-j-1]) {ok=0;break;} 22 } 23 if(ok) return true; 24 return false; 25 } 26 bool solve(int s) 27 { 28 int num=0; 29 for(int i=2;i<=10;i++) 30 { 31 if(change(s,i)) num++; 32 if(num==2) return true; 33 } 34 return false; 35 } 36 int main() 37 { 38 int s; 39 scanf("%d",&s); 40 while(1) 41 { 42 s++; 43 if(solve(s)) break; 44 } 45 printf("%d\n",s ); 46 return 0; 47 48 }
先转化进制,再判断是否为回文
方法——枚举
注意事项:S转化为2进制时长度很长,所以应用数组储存。
总结:白皮书水题。。。但还是错了几遍。。。