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;
}