一、题目描述
链接:https://www.acwing.com/problem/content/1349/
来源:ACwing
回文数是指数字从前往后读和从后往前读都相同的数字。
例如,12321 是一个回文数,77778 不是一个回文数。
当然回文数没有前导 0 和尾数 0,因此 0220 不是一个回文数。
我们观察数字 21,它在十进制表示下不是一个回文数,但是在二进制表示下它却是一个回文数(10101)。
现在请你编写一个程序,读入两个整数 N 和 S,输出满足大于 S 并且至少在两种进制表示下(二进制至十进制)都是回文数的前 N 个整数。
输入格式
共一行,包含两个整数 N 和 S。
输出格式
共 N 行,每行输出一个满足条件的整数。
数字按从小到大顺序依次输出。
数据范围
1 ≤ N ≤ 15,
0 < S < 10000
输入样例:
3 25
输出样例:
26
27
28
二、题解
与USACO_CHA1中的上一题没有什么区别。
有疑惑的同学可以参考我的另一篇博文:USACO_CHA1_回文平方数
三、AC代码
#include <iostream>
using namespace std;
int n, s, bit;
int ans[50];
bool check(int num);
void trans(int num, int base);
int main()
{
cin >> n >> s;
for (int i = s + 1; n; i++)
{
if (check(i))
{
n--;
cout << i << endl;
}
}
system("pause");
return 0;
}
void trans(int num, int base)
{
bit = 0;
while (num)
{
ans[bit++] = num % base;
num /= base;
}
}
bool check(int num)
{
int TrueNum = 0;
for (int i = 2; i <= 10 && TrueNum < 2; i++)
{
bool flag = true;
trans(num, i);
for (int i = 0; i < bit / 2 && flag; i++)
{
if (ans[i] != ans[bit - i - 1])
{
flag = false;
}
}
if (flag)
{
TrueNum++;
}
}
if (TrueNum >= 2)
{
return true;
}
else
{
return false;
}
}
如果我的题解对您有帮助,还望您不吝点赞。
欢迎讨论交流,期待共同进步!