题解:B4276 [蓝桥杯青少年组国赛 2023] 八进制回文平方数
[蓝桥杯青少年组国赛 2023] 八进制回文平方数
模拟即可。
我们要寻找这样的数:
- 转化为八进制后为回文数。
- 十进制下为完全平方数。
然后我们就有了这样的思路:在范围内枚举自然数,求该自然数平方后的结果,将结果转为八进制数,判断其是否是回文数,是的话输出。
这里有一个细节:可以边转八进制边构造回文数。怎么做到呢?我们都知道,短除法在最后要把结果倒过来,所以构造回文数时只要直接除不倒过来就行了。短除法就不讲了。这样的作法比字符串快得多。
第二个细节:如何构造完全平方数?题目输入数据 for (int i = 1; i * i <= N; ++i),这样便避免了sqrt()函数的麻烦。
代码如下:
#include <iostream>
using namespace std;
//判断回文数
bool check(int num) {
int old = num;
int new_ = 0;//new是关键字
while (num > 0) {
new_ = new_ * 8 + (num % 8);//短除法
num /= 8;
}
return old == new_;//是否相等
}
int main() {
int N;
cin >> N;
//判断完全平方数
for (int i = 1; i * i <= N; ++i) {//简单写法
int square = i * i;//平方
if (check(square)) {
cout << square << ' ';//直接输出
}
}
return 0;
}