双基回文数很多,所以可以暴力。
1 #include <iostream> 2 #include <cstdlib> 3 #include <cstdio> 4 #include <iomanip> 5 6 using namespace std; 7 8 int trans(int n, int base) 9 { 10 int a[100], i = 1; 11 a[0]=n%base; 12 n/=base; 13 while (n) 14 { 15 a[i++]=n%base; 16 n/=base; 17 } 18 int len = i; 19 int mrk = 1; 20 for (i = 0; i < len; ++i) 21 { 22 if (a[i] != a[len-1-i]) 23 { 24 mrk = 0; break; 25 } 26 } 27 return mrk; 28 } 29 30 int main(void) 31 { 32 int n; 33 #ifndef ONLINE_JUDGE 34 freopen("in", "r", stdin); 35 #endif 36 while (~scanf("%d", &n)) 37 { 38 int mrk = 0, cnt = 0; 39 for (int i = n+1; ; ++i) 40 { 41 cnt = 0; 42 for (int j = 2; j < 11; ++j) 43 { 44 if (trans(i, j)) 45 { 46 cnt++; 47 if (cnt==2) 48 { 49 mrk = 1; 50 printf("%d\n", i); 51 break; 52 } 53 } 54 } 55 if (mrk) 56 break; 57 } 58 } 59 60 return 0; 61 }
注意在trans()函数中,a数组不能小于32,原因是,转化成2进制的时候,数组要足够大,刚开始只开了20,出现了错误,并且发现一个有趣的问题,i的值会竟然会自动调整!不信的话,你试试把代码改成下面这样:(只改这个地方,其他地方不变)
1 int trans(int n, int base) 2 { 3 int a[20], i = 1; 4 a[0]=n%base; 5 n/=base; 6 while (n) 7 { 8 a[i++]=n%base; 9 n/=base; printf("i = %d\n", i); //当 n=1600156, base = 2 的时候,运行一下 10 }
这个我还不知道为什么不会报数组越界,Runtime Error。。