目录

​1,题目描述​

​题目大意​

​注意​

​2,思路​

​3,代码​


1,题目描述

PAT_甲级_1024 Palindromic Number (25分) (C++)【签到题】_产生回文数

Sample Input 1:

67 3

 

Sample Output 1:

484
2

 

Sample Input 2:

69 3

 

Sample Output 2:

1353
3

题目大意

通过一种运算,可以使任意一个非回文数转换为回文数。具体操作举个例子吧。

67 + 76 = 143, and 143 + 341 = 484.

要求输出最终的回文数,以及操作的步数。

注意

  • 输入的数字N<=10^10;
  • 输入的最大步数K<=100,到达最大步数后,若仍未成为回文数,则输出当前数值,以及K;

2,思路

  • 利用vector<int> input存放输入的数字,以及答案;
  • 以字符串形式输入原始数据,并将其存入input中;
  • 设计函数:
  1. bool isPali(vector<int> &a)                                  //判断是否为回文数;
  2. vector<int> reversed(vector<int> &origin)           //反转数字
  3. 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;
}