题目
题目大意
一个非回文数,加上它的翻转数所得的和,进行k次,有可能会得到一个回文数。给出一个数n,限制相加次数为k次,如果小于k次就得到回文数,那么输出该回文数和相加的次数;如果进行k次还没有得到回文数,那么输出最后的结果和k值。
思路
10的10次方,按照最坏情况考虑,乘以100,为10的20次方,超过了long long的范围,所以是大数加法题目。要用字符串来表示数字。由于是加法运算,不管哪两个数相加都最多进1位,因此可以用isadd来表示是否需要进位。注意计算首位加法,如果进位,就跳出了for循环,所以要再循环外放一个isadd的if语句,如果进位,res再加‘1’。
代码
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;int main(){string s;int k;cin >> s >> k;for (int i = 0; i < k; i++){string s2 = s;reverse(s2.begin(), s2.end());if (s == s2){cout << s << endl;cout << i << endl;return 0;}string res = "";bool isadd = false;for (int i = (int)s.size() - 1; i >= 0; i--){if (isadd){res += ((s[i] - '0') + (s2[i] - '0') + 1) % 10 + '0'; // 先加1,后取余if ((s[i] - '0') + (s2[i] - '0') + 1 >= 10){isadd = true;}else{isadd = false;}}else{res += ((s[i] - '0') + (s2[i] - '0')) % 10 + '0';if ((s[i] - '0') + (s2[i] - '0') >= 10){isadd = true;}else{isadd = false;}}}if (isadd) res += '1';reverse(res.begin(), res.end());s = res;}cout << s << endl;cout << k << endl;return 0;
}