题解:B4276 [蓝桥杯青少年组国赛 2023] 八进制回文平方数

· · 题解

[蓝桥杯青少年组国赛 2023] 八进制回文平方数

模拟即可。
我们要寻找这样的数:

然后我们就有了这样的思路:在范围内枚举自然数,求该自然数平方后的结果,将结果转为八进制数,判断其是否是回文数,是的话输出。
这里有一个细节:可以边转八进制边构造回文数。怎么做到呢?我们都知道,短除法在最后要把结果倒过来,所以构造回文数时只要直接除不倒过来就行了。短除法就不讲了。这样的作法比字符串快得多。
第二个细节:如何构造完全平方数?题目输入数据 N,便可写出以下的代码: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;
}