[PAT解题报告] Palindromic Number
简单题: 给定一个数x,不断把x和其自身颠倒相加(例如x = 12,就把它和21相加),最多进行k步,是否能得到一个回文数。
分析: 虽然输入的数不超过long long但是结果可能很大。
我还是用数组表示大整数,这样方便颠倒并做加法。加法用的还是1023的方法,就是模拟笔算过程,每个数组元素存一位数。按照我的习惯,我用a[0]表示位数,a[a[0]]是最高位,a[1]是最低位(个位),判断回文数也直接循环判断。
代码:
#include <cstdio>
#include <string>
#include <cstring>
using namespace std;
int a[120], c[120];
bool isPalindromic() {
for (int i = 1, j = a[0]; i < j; ++i, --j) {
if (a[i] != a[j]) {
return false;
}
}
return true;
}
void cal() {
memset(c, 0, sizeof(c));
for (int i = 1; i <= a[0]; ++i) {
c[i] += (a[i] + a[a[0] - i + 1]);
if (c[i] >= 10) {
c[i] -= 10;
++c[i + 1];
}
}
c[0] = c[a[0] + 1]?(a[0] + 1):a[0];
}
void print() {
if (a[0]) {
for (int i = a[0]; i; --i) {
printf("%d",a[i]);
}
puts("");
}
else {
puts("0");
}
}
int main() {
long long x;
int k;
scanf("%lld%d",&x,&k);
for (a[0] = 0; x; a[++a[0]] = x % 10, x /= 10)
;
int step = 0;
for (; (step < k) && (!isPalindromic()); ++step) {
cal();
memcpy(a, c, sizeof(a));
}
print();
printf("%d\n",step);
return 0;
}
原题链接: http://www.patest.cn/contests/pat-a-practise/1024


