AcWing 1501. 回文数
原题链接
简单
作者:
白金之星
,
2021-07-17 19:37:03
,
所有人可见
,
阅读 285
C++ 代码
#include<bits/stdc++.h>
using namespace std;
//定义两个变量 op_lim记录样例限制的操作次数 op_cnt记录当前操作次数
int op_lim = 0, op_cnt = 0;
//定义一个判断是否为回文数的函数
bool is_pal(vector<int> num)
{
auto temp = num;
reverse(temp.begin(), temp.end());
if(temp == num)
return true;
else return false;
}
//定义一个进行一次"操作"的函数
vector<int> op(vector<int> num)
{
//当前操作次数 + 1
op_cnt++;
//翻转后高精度相加
auto temp = num;
reverse(temp.begin(), temp.end());
int t = 0;
vector<int> res;
for(int i = num.size() - 1; i >= 0; i--)
{
int s = 0;
s = num[i] + temp[i] + t;
t = s / 10;
res.push_back(s % 10);
}
if(t) res.push_back(t);
reverse(res.begin(), res.end());
return res;
}
int main()
{
//读入数字和限制次数,数字用字符串读入
string str;
cin >> str >> op_lim;
//将str中的数字存入num
vector<int> num;
for(int i = 0; i < str.size(); i++)
num.push_back(str[i] - '0');
//判断当前num是否为回文数,如果是就直接输出
if(is_pal(num))
{
for(int i = 0; i < num.size(); i++) cout << num[i];
cout << "\n" << op_cnt;
}
//如果不是回文数,就在op_lim次数内循环进行操作和判断
//如果进行若干次循环后,判断是回文数,就直接输出
//如果进行op_lim次循环后,仍然判断不是回文数,也直接输出
else
for(int i = op_lim - 1; i >= 0; i--)
{
num = op(num);
if(is_pal(num))
{
for(int i = 0; i < num.size(); i++) cout << num[i];
cout << "\n" << op_cnt;
return 0;
}
else if(!i)
{
for(int i = 0; i < num.size(); i++) cout << num[i];
cout << "\n" << op_cnt;
return 0;
}
}
}
帅