题目
思路
涉及到长整数的加法运算
代码
#include <iostream>
#include <string>
#include<algorithm>
#include<vector>
#include<stack>
#include<map>
#include<set>
#include<queue>
#include<list>
#include<sstream>
using namespace std;
#define nmax 100
#define inf 999999
string num;
int K;
bool JudgePalindromic(const string& num)
{
int i = 0, j = num.length() - 1;
while (i <= j){
if (num[i] != num[j])
return false;
++i, --j;
}
return true;
}
string num_converse(string& num)
{
string new_num;
for (int i = num.length()-1; i >=0;--i){
new_num += num[i];
}
return new_num;
}
void stringtoList(list<int>& list,const string& num)
{
stringstream s;
for (int i = 0; i < num.length(); ++i){
int tmp;
s << num[i];
s >> tmp;
s.clear();
list.emplace_back(tmp);
}
}
string LongNumAdd(string& num1, string& num2)
{
list<int> list1, list2;
stringtoList(list1, num1);
stringtoList(list2, num2);
int carry = 0; //进位标志
if (list1.size() < list2.size())
list1.swap(list2);
auto p = list1.rbegin();
for (auto q = list2.rbegin(); q != list2.rend(); ++p,++q){
int result = *p + *q + carry;
*p = result % 10;
carry = result / 10;
}
if (carry > 0){
while(p != list1.rend()){
int result = *p + carry;
*p = result % 10;
carry = result / 10;
p++;
}
if (carry > 0){
list1.emplace_front(carry);
}
}
stringstream s;
for (auto& p : list1){
s << p;
}
return s.str();
}
int main()
{
cin >> num >> K;
for (int i = 0; i <= K; ++i){
if (JudgePalindromic(num)){
cout << num << " " << i;
break;
}
if (i == K) {
cout << num << " " << K;
}
string new_num = num_converse(num);
num = LongNumAdd(num, new_num);
}
return 0;
}