PAT 甲级 1024 Palindromic Number 高精度+回文数

PAT 甲级 1024 Palindromic Number 高精度+回文数
PAT 甲级 1024 Palindromic Number 高精度+回文数

Solution:

这道题的意思是给出一个不超过10的次方的数(由于这个数很大,所以我们把它当作字符串来处理),如果它是回文数,直接输出即可,需要0步变换;如果不是回文数,则要求出变换几次可以把它变成回文数(最多不超过k步),如果超过k步,到此步就停止,输出当前数和k即可;若没有超过k步,到哪步变换成回文数就输出此回文数和当前步数。
变换如下:将这个数反转,加上这个反转数,得到一个新数。

代码如下:

//高精度+回文数
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;

string s;//读入的数
int k;//最大次数

bool judge(string s){//判断回文数
  int len=s.length();
  for(int i=0;i<len;i++){
    if(s[i]!=s[len-i-1]){
        return false;
    }
  }
  return true;
}

int main(){
  cin>>s>>k;
  if(judge(s)){
        cout<<s<<endl;
        cout<<0;
        return 0;
  }
  for(int i=0;i<k;i++){
    string rev_s=s;//反转后的字符串
    reverse(rev_s.begin(),rev_s.end());
    string temp;//s与rev_s相加的结果
    int jw=0;
    int len=s.length();
    for(int j=len-1;j>=0;j--){
        int num=s[j]-'0'+rev_s[j]-'0'+jw;
        if(num>=10){
            num-=10;
            jw=1;
        }else{
            jw=0;
        }
        char ch=num+'0';
        temp=ch+temp;
    }
    if(jw==1){
        temp='1'+temp;
    }
    s=temp;//s变成新的数
    if(judge(temp)){//判断新的数是否为回文数
        cout<<temp<<endl;
        cout<<i+1;
        return 0;
    }
    if(i==k-1){//若到最后一步仍没有变为回文数
        cout<<temp<<endl;
        cout<<i+1;
    }
  }

  return 0;
}