本题解采用的是从小到大构造回文串,不断的逼近 n,当大于n时停止构造

#include<iostream> 
#include<cmath>
#include<algorithm>
#include<vector>
using namespace std;

int  plain(int n, int num) {
    vector<int> a;
   //将数字的各位拆分
    while (1) {
        a.push_back((num % 10));
        num /= 10;
        if (num == 0) break;
    }
    //反转字符串
    reverse(begin(a), end(a));

    int m = ceil(n / 2);
    if (n != 1) //个位数字排除,不用处理
    {
        for (int i = m - 1; i >= 0; i--) {
            a.push_back(a[i]);
        }
    }
    int sum = 0;
    //再合成
    for (int val: a) {
        sum = sum * 10 + val;
    }
    return sum;
}

int main() {

    int n; cin >> n;

    for (int i = 1; i <= 6; i++) //第一个循环限制回文的位数
    {
        for (int j = pow(10, ceil(i / 2.0)-1); j <pow(10, ceil(i / 2.0)); j++) //第二个循环产生回文的镜像段  eg:11 的 1,121 的 12
        {
            int sum = plain(i, j); //用利用函数将镜像段构造成回文
            if (sum <= n) cout << sum << endl; 
            else break;
        }
    }
    return 0;
}