题目大意
向前或向后写入时将相同的数字称为回文数。例如,1234321是回文数。所有一位数字都是回文数。 非回文数可以通过一系列操作与回文数配对。首先,将非回文数反转,并将结果添加到原始数中。如果结果不是回文数,则重复此操作,直到给出回文数。例如,如果我们从67开始,则可以分两步获得回文数:67 + 76 = 143,以及143 + 341 = 484。 给定任何正整数N,您应该找到其配对的回文数和找到它所采取的步骤数。
所谓的坑
本以为使用long long 类型的可以解决大数问题,后来发现部分测试点无法通过,改为直接使用string类型,自定义相加即可。
代码
#include<bits/stdc++.h>
using namespace std;
int maxStep;
string num;
//数字转化为string
string IntToString(long long num) {
string res;
while (num) {
res.push_back(char(num % 10 + '0'));
num = num / 10;
}
reverse(res.begin(), res.end());
return res;
}
//string转化为数字
long long StringToInt(string str) {
long long res = 0;
for (int i = 0; i < str.size(); i++) {
res += (str[i] - '0') * pow(10, str.size() - i - 1);
}
return res;
}
//判断回文
bool judgetPalindromic(string str) {
int size = str.size();
for (int i = 0; i <= size / 2; i++) {
if (str[i] != str[size - 1 - i]) {
return false;
}
}
return true;
}
//两个字符串表示的数字相加
string plusString(string s1, string s2) {
string s;
int size1 = s1.size() - 1;
int size2 = s2.size() - 1;
int fa = 0;
while (size1 >= 0 && size2 >= 0) {
s.push_back(char(((s1[size1] - '0') + (s2[size2] - '0') + fa) % 10 + '0'));
fa = ((s1[size1] - '0') + (s2[size2] - '0') + fa) / 10;
size1--;
size2--;
}
if (fa) {
s.push_back(char(fa + '0'));
}
return s;
}
int main() {
cin >> num >> maxStep;
string tem;
for (int i = 0; i < maxStep; i++) {
if (judgetPalindromic(num)) {
cout << num << endl;
cout << i;
return 0;
}
tem = num;
reverse(tem.begin(), tem.end());
num = plusString(num, tem);
}
reverse(num.begin(), num.end());
cout << num << endl;
cout << maxStep;
return 0;
}