[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