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

December 14, 2012

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


#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <iomanip>

using namespace std;

int trans(int n, int base)
{
    int a[100], i = 1;
    a[0]=n%base;
    n/=base;
    while (n)
    {
        a[i++]=n%base;
        n/=base;
    }
    int len = i;
    int mrk = 1;
    for (i = 0; i < len; ++i)
    {
        if (a[i] != a[len-1-i])
        {
            mrk = 0; break;
        }
    }
    return mrk;
}

int main(void)
{
    int n;
#ifndef ONLINE_JUDGE
    freopen("in", "r", stdin);
#endif
    while (~scanf("%d", &n))
    {
        int mrk = 0, cnt = 0;
        for (int i = n+1; ; ++i)
        {
            cnt = 0;
            for (int j = 2; j < 11; ++j)
            {
                if (trans(i, j))
                {
                    cnt++;
                    if (cnt==2)
                    {
                        mrk = 1;
                        printf("%d\n", i);
                        break;
                    }
                }
            }
            if (mrk)
                break;
        }
    }

    return 0;
}

注意在trans()函数中,a数组不能小于32,原因是,转化成2进制的时候,数组要足够大,刚开始只开了20,出现了错误,并且发现一个有趣的问题,i的值会竟然会自动调整!不信的话,你试试把代码改成下面这样:(只改这个地方,其他地方不变)


 int trans(int n, int base)
 {
     int a[20], i = 1;
     a[0]=n%base;
     n/=base;
     while (n)
     {
         a[i++]=n%base;
         n/=base; printf("i = %d\n", i); //当 n=1600156, base = 2 的时候,运行一下
     }

这个我还不知道为什么不会报数组越界,Runtime Error。。

comments powered by Disqus