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