入门经典 第七章 7.7.4 双基回文数

双基回文数很多,所以可以暴力。

 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。。

原文地址:https://www.cnblogs.com/liuxueyang/p/2818661.html