算法竞赛入门经典 暴力求解法 简单枚举 7.1.4 双基回文数

问题描述:如果一个正整数n至少在两个不同的进位制b1和b2下都是回文数(2<=b1,b2<=10),则称n是双基回文数(注意:回文数不能包含前导0)。

                   输入正整数S<10^6,输出比S大的最小双基回文数。

样例输入:1600000

样例输出:1632995

分析:最自然的想法就是:从S+1开始,依次判断每个数是否为双基回文数,而在判断时要列举所有可能的基数(2~10),一切都是那么的”暴力“。然而令人意外的是,这样做对于S<10^6这样的小规模数据来说是足够快的。

附上实现代码:

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
int fun(int x,int n)
{
    int a[100],b[100];
    int k=0,i=0,j=0;
    for(i=0;;i++)
    {
        a[i]=x%n;
        x=x/n;
        if(x==0) break;
    }
    k=i;
    int flag=1;
    for (i=0;i<=k/2;i++)
    {
        if (a[i]!=a[k-i])
        {
           flag=0;
           break;
        }
    }
    if(flag==1)
        return 1;
    else
        return 0;
}
int main()
{
    int n,i;
    while (scanf("%d",&n)==1)
    {
        for(;;n++) //枚举,找出最小的
        {
            int k=0;
            int flag = 0;
            for(i=2;i<=10;i++)
            {
                if(fun(n,i)) k++;
                if(k>=2){flag=1; break;}
            }
            if(flag)
            {
                 printf("%d\n",n);
                 break;
            }
        }
    }
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

posted on 2015-04-10 11:17  Tob__yuhong  阅读(89)  评论(0编辑  收藏  举报

导航