本题解采用的是从小到大构造回文串,不断的逼近 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; }