双基回文数

来源:互联网 发布:网络被劫持了怎么办 编辑:程序博客网 时间:2024/05/21 17:05

记录下写的代码和题目方便自己不会忘记(进制函数含借鉴)
问题描述:如果一个正整数n至少在两个不同的进位制b1和b2下都是回文数(2<=b1,b2<=10),则称n是双基回文数(注意:回文数不能包含前导0)。
输入正整数S<10^6,输出比S大的最小双基回文数。

样例输入:1600000

样例输出:1632995

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

include<iostream>#include<string.h>using namespace std;int fun(int x,int n){    int a[100];    int k=0;    memset(a,0,sizeof(a));    for(int i=0;;i++){        a[i]=x%n;        x/=n;        if(x==0){            k=i;            break;        }    }    int flag=1;    for(int 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(void){    int n;    while(cin>>n){        for(;;n++){            int k=0;            int flag=0;            for(int i=2;i<=10;i++){                if(fun(n,i))                    k++;                if(k>=2){                    flag=1;                    break;                }            }if(flag){                cout<<n<<endl;                break;            }        }    }}
0 0