我的PAT-ADVANCED代码仓:https://github.com/617076674/PAT-ADVANCED
原题链接:https://pintia.cn/problem-sets/994805342720868352/problems/994805476473028608
题目描述:
题目翻译:
1024 回文数
正向反向书写时相同的数字称为回文数字。 例如,1234321是回文数字。 所有单个数字都是回文数字。
非回文数字可以通过一系列操作与回文数字配对。 首先,反转非回文数字,并将结果添加到原始数字。 如果结果不是回文数,则重复这一过程,直到它给出回文数。 例如,如果我们从67开始,我们可以分两步获得回文数:67 + 76 = 143,143 + 341 = 484。
给定任何正整数N,您应该找到其配对的回文数和找到它的步骤数。
输入格式:
每个输入文件包含一个测试用例。每个测试用例由两个正数N和K组成,其中N(<= 10 ^ 10)代表初始数字,K(< 100)代表最大步骤数。数字由一个空格分隔。
输出格式:
对每个测试用例,在2行中每行输出一个数字。第一个数字是操作后得到的回文数字,第二个数字是得到该回文数字经过的操作步数。如果经过K步操作后还没有得到回文数,则输出K步操作后得到的数和K。
输入样例1:
67 3
输出样例1:
484
2
输入样例2:
69 3
输出样例2:
1353
3
知识点:大数相加
思路:按题述编程即可
时间复杂度是O(Kn),其中n是输入数字N的位数。空间复杂度是O(1)。
C++代码:
#include<iostream>
using namespace std;
string reverse(string s);
string add(string s1, string s2);
bool isPalindromicNumber(string s);
int main(){
string N, tempN;
int K;
cin >> N >> K;
int step = 0;
while(!isPalindromicNumber(N)){
tempN = add(N, reverse(N));
N = tempN;
step++;
if(step >= K){
break;
}
}
cout << N << endl;
cout << step << endl;
}
string reverse(string s) {
string result = "";
for(int i = s.length() - 1; i >= 0; i--) {
result += s[i];
}
return result;
}
string add(string s1, string s2) {
int flag = 0;
s1 = reverse(s1);
s2 = reverse(s2);
string result = "";
int index1 = 0;
int index2 = 0;
while(true) {
if(index1 >= s1.length() && index2 >= s2.length()) {
if(flag != 0) {
result += flag + '0';
}
break;
} else {
int num = s1[index1] - '0' + s2[index2] - '0' + flag;
if(num >= 10) {
num -= 10;
flag = 1;
} else {
flag = 0;
}
result += num + '0';
index1++;
index2++;
}
}
return reverse(result);
}
bool isPalindromicNumber(string s){
for(int i = 0; i < s.length() / 2; i++){
if(s[i] != s[s.length() - 1 - i]){
return false;
}
}
return true;
}
C++解题报告: