1024. Palindromic Number (25)
题目大意
给定一个数字,和允许翻转后相加的次数cnt,求要多少次才能变成一个回文数字,输出那个回文数字和翻转相加了多少次,如果本身就是回文数字就输出0次,如果超过给定的次数cnt了,就输出那个不是回文的结果,并且输出给定的次数cnt。
基本思路
用字符串完成大整数的相加操作。
可以通过对字符串翻转后比较来判断是否为回文串。
代码
#include <bits/stdc++.h>
using namespace std;
string s;//适中作为每次循环的初始串
void add(string t){
int carry=0;//进位
//大整数运算
for (int i = 0; i < t.length(); ++i) {
// cout<<carry-'0'<<endl;
s[i]=s[i]+t[i]+(carry-'0');//两个数字字符相加,会多加一个48('0')
carry=0;
if(s[i]>'9'){
s[i]=s[i]-10;
carry=1;
}
}
//考虑最高位的进位
if(carry==1) s=s+'1';
//反转最后的结果
reverse(s.begin(),s.end());
}
int main(){
int cnt,i;//允许反转的次数,当前是第几次反转(从0开始)
cin>>s>>cnt;
//进行反转操作
for (i = 0; i < cnt; ++i) {
string t=s;
reverse(t.begin(),t.end());
//如果s已经是回文串或者反转的次数用尽,退出
if(s==t||i==cnt) break;
//进行大整数相加的操作
add(t);
}
//输出
cout<<s<<endl<<i;
}