算法竞赛入门经典 暴力求解法 简单枚举 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

#include

#include

#include

#include

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;

}

}

}

}

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

[an error occurred while processing the directive]