题目描述
回文数是指数字从前往后读和从后往前读都相同的数字。
例如,12321 是一个回文数,77778 不是一个回文数。
当然回文数没有前导 0 和尾数 0,因此 0220 不是一个回文数。
我们观察数字 21,它在十进制表示下不是一个回文数,但是在二进制表示下它却是一个回文数(10101)。
现在请你编写一个程序,读入两个整数 N 和 S,输出满足大于 S 并且至少在两种进制表示下(二进制至十进制)都是回文数的前 N 个整数。
输入格式
共一行,包含两个整数 N 和 S。
输出格式
共 N 行,每行输出一个满足条件的整数。
数字按从小到大顺序依次输出。
数据范围
1≤N≤15,
0<S<10000
28
样例
输入样例:
3 25
输出样例:
26
27
28
算法1
(暴力枚举)
这个题直接从s+1开始枚举,然后依次判断数在x进制下是否为回文数,如果找到了,那么就将回文次数的个数+1,如果可以至少出现2次回文,那么这就是一个满足要求的数,当我们找到了n个数以后,我们就可以跳出循环了,否则就需要一直执行下去。
C++ 代码
#include<bits/stdc++.h>
using namespace std;
bool f(int s,int x)//判断某个数在x进制下是否为回文数
{
int t=s;
stack<int> stk;
while(t)
{
stk.push(t%x);
t/=x;
}
while(stk.size())
{
if(stk.top()!=s%x)
return false;
stk.pop();
s/=x;
}
return true;
}
int main()
{
int n,s;
cin>>n>>s;
int cnt=0;
s++;
while(1)
{
if(cnt==n)//找到了n个数
{
break;
}
int t=0;
for(int x=2;x<=10;x++)//从2进制到10进制枚举
{
if(f(s,x))
t++;
}
if(t>=2) cout<<s<<endl,cnt++;//至少有2种进制下为回文次数
s++;
}
return 0;
}