題目
題目大意
一個非回文數,加上它的翻轉數所得的和,進行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;
}