思路
一个数加上反转的数是不是回文数。数据很大,两个大数相加,要用高精加。
知识点
-
回文数可以用vector里的
(a.rbegin(), a.end())
反向遍历得到
步骤
-
先把两个数相加
-
记得先判断当前的是不是已经是回文数了,写个
if(!check(A))
把它隔出去就好 -
判断是否为回文数,可以写个bool()判断 (算是双指针吧hh)
-
最后倒序遍历输出结果就好啦
错误历程
-
check函数写成判断字符串形式的了,然后就在想怎么把vector转成字符串,直接把判断函数写成判断vector型的不就好了?
-
反转数字时也想了半天,vexctor有自带的 反向遍历函数
-
得不到回文串也要输出答案!仔细读题!
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
bool check(vector<int> &num)
{
for (int i = 0, j = num.size() - 1; i < j; i ++ , j -- )
if (num[i] != num[j]) return false;
return true;
}
vector<int> add(vector<int> &A, vector<int> &B)
{
vector<int> C;
int t = 0;
for (int i = 0; i < A.size(); i ++ )
{
t += A[i];
if (i < B.size()) t += B[i];
C.push_back(t % 10);
t /= 10;
}
if (t) C.push_back(t);
return C;
}
int main()
{
string a;
int n;
cin >> a >> n;
vector<int> A;
for (int i = a.size() - 1; i >= 0; i -- ) A.push_back(a[i] - '0');
int cnt = 0;
if (!check(A))
{
while(cnt < n)
{
vector<int> B(A.rbegin(), A.rend());
A = add(A, B);
cnt ++ ;
if (check(A)) break;
}
}
for (int i = A.size() - 1; i >= 0; i -- ) cout <<A[i];
cout << endl << cnt << endl;
return 0;
}
太难受了,我写的乱七八糟的代码在这能ac,在pat就差一个数据过不掉法克
更正:循环条件写错了,有一个很巧的数据刚好被我的错误代码发现了hhh,现我的愚蠢代码已更正
没过的数据是: $67$ $ 2$
因为之前的循环条件写的是:if(cnt == n)
我多输出了一次
因为我写的太麻烦了,只能在最后的判断条件上加了个判断它是不是一直都没有成功的成为回文数
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
bool flag = true;
bool check(string str)
{
for (int i = 0, j = str.size() - 1; i < j; i ++ , j -- )
if (str[i] != str[j]) return false;
return true;
}
vector<int> add(vector<int> &A, vector<int> &B)
{
vector<int> C;
int t = 0;
for (int i = 0; i < A.size(); i ++ )
{
t += A[i];
if (i < B.size()) t += B[i];
C.push_back(t % 10);
t /= 10;
}
if (t) C.push_back(t);
return C;
}
int main()
{
string a;
int n;
cin >> a >> n;
if (check(a)) cout << a << endl << "0" << endl;
else
{
int cnt = 0;
for (int i = 0; i < n; i ++ )
{
vector<int> A, B;
for (int i = a.size() - 1; i >= 0; i -- ) A.push_back(a[i] - '0');
for (int i = 0; i < a.size(); i ++ ) B.push_back(a[i] - '0');
auto C = add(A, B);
cnt ++ ;
string res;
for (int i = C.size() - 1; i >= 0; i -- ) res += to_string(C[i]);
if (check(res))
{
cout << res << endl << cnt << endl;
flag = false;
break;
}
else a = res;
}
if (cnt == n && flag == true) cout << a << endl << n << endl;
}
return 0;
}