PAT_甲级_1024 Palindromic Number (25分) (C++)【签到题】
原创
©著作权归作者所有:来自51CTO博客作者再见萤火虫IT的原创作品,请联系作者获取转载授权,否则将追究法律责任
目录
1,题目描述
题目大意
注意
2,思路
3,代码
1,题目描述

Sample Input 1:
Sample Output 1:
Sample Input 2:
Sample Output 2:
题目大意
通过一种运算,可以使任意一个非回文数转换为回文数。具体操作举个例子吧。
67 + 76 = 143, and 143 + 341 = 484.
要求输出最终的回文数,以及操作的步数。
注意
- 输入的数字N<=10^10;
- 输入的最大步数K<=100,到达最大步数后,若仍未成为回文数,则输出当前数值,以及K;
2,思路
- 利用vector<int> input存放输入的数字,以及答案;
- 以字符串形式输入原始数据,并将其存入input中;
- 设计函数:
- bool isPali(vector<int> &a) //判断是否为回文数;
- vector<int> reversed(vector<int> &origin) //反转数字
- vector<int> convert(vector<int> &origin) //将原数和反转后的数求和
- 以k为限制,先判断是否为回文,然后convert,step加一,不断重复;
3,代码
#include<iostream>
#include<vector>
using namespace std;
bool isPali(vector<int> &a){ //判断是否为回文数
int i = 0, j = a.size()-1;
while(i < j){
if(a[i] != a[j]) return false;
i++;j--;
}
return true;
}
vector<int> reversed(vector<int> &origin){ //反转数字
vector<int> res;
for(int i = origin.size()-1; i >= 0; i--) res.push_back(origin[i]);
return res;
}
vector<int> convert(vector<int> &origin){ //将原数和反转后的数求和
vector<int> rev, sum;
rev = reversed(origin);
int c = 0, temp = 0; //c进位 temp暂存数据
for(int i = origin.size()-1; i >= 0; i--){
temp = origin[i] + rev[i] + c;
if(temp > 9){
c = 1;
temp -= 10;
}else c = 0;
sum.push_back(temp);
}
if(c == 1) sum.push_back(1);
return reversed(sum);
}
void print(vector<int> v){
for(int i = 0; i < v.size(); i++) cout<<v[i];
}
int main(){
int k, step = 0;
string s;
cin>>s>>k;
vector<int> input;
for(int i = 0; i < s.length(); i++){
input.push_back(s[i] - '0');
}
while(step < k){ //此处是小于(不是小于等于) 类似于for(int step = 0; step < k; step++)
if(isPali(input) == true){
print(input);
cout<<endl<<step;
return 0;
}
input = convert(input);
step++;
}
print(input);
cout<<endl<<k;
return 0;
}