双基回文数 简单枚举 暴力啊

如果一个正整数n至少在两个不同的进位制b1和b2下都是回文数(2<=b1,b2<=10),则称n是双基回文数(注意,回文数不能包含前导零).输入正整数S<10的6次方,输出笔S大的

最小双基回文数.

样例输入:1600000

样例输出:1632995

分析:最自然的想法就是:从n+1开始依次判断每个数是否为双基回文数,而在判断时要枚举所有可能的基数(2-10),一切都是那么的"暴力".令人意外的是:这样做对于S<10的6次方

这样的"小规模数据"来说是足够快的----双基回文数太多太密了.

#include<iostream>
using namespace std;
bool huiwen(int n)
{
 int total=0;
 for(int base=2;base<=10;base++)
 {
  int i=1,a[30],s;
  s=n;
  while(s)
  {
   a[i]=s?se;
   s=s/base;
   i++;
  }
  i--;
  int j;
  for(j=1;j<=i/2;j++)
   if(a[j]!=a[i-j+1])break;
   if(j>i/2)total++;
   if(total>=2)return true;
 }
 return false;
}
int main()
{
 int s;
 while(scanf("%d",&s)==1)
 {
  for(s=s+1;;s++)
  {
   if(huiwen(s))
   { cout<<s<<endl;break;}//不可以不加大括号,那样就不管是不是都break;即重新输入
  }
 }
 return 0;
}
View Code

 

posted on 2013-07-11 16:08  Forgiving  阅读(257)  评论(0编辑  收藏  举报