题解
回文数求和
1 条题解
-
0
解题思路
大整数
a最多有 2000 位,分两步做:- 判断回文:把第 1 个字符和最后一个比、第 2 个和倒数第 2 个比……如果全相等就是回文数,输出
YES。 - 不是回文:计算
a + a。相当于高精度加法,也可以直接看成每一位数字乘 2 再处理进位:从个位开始,a[i]×2,超过 10 的部分进到高一位,这一位只留个位。最后从高位到低位输出。
参考代码
#include <iostream> using namespace std; char a[2005]; // 大整数(字符串) int ans[2010]; // a+a 的结果 int main() { cin >> a; int len = 0; while (a[len]) len++; // 判断是否回文:首尾字符一一比较 int hui = 1; for (int i = 0; i < len / 2; i++) { if (a[i] != a[len - 1 - i]) { hui = 0; break; } } if (hui) { // 是回文数 cout << "YES" << endl; return 0; } // 不是回文数:计算 a+a,每一位数字乘2,再处理进位 for (int i = 0; i < len; i++) { int d = a[len - 1 - i] - '0'; // 从个位开始取数字 ans[i] += d * 2; ans[i + 1] += ans[i] / 10; // 进位 ans[i] %= 10; } // 最高位可能还有进位 int n = len; while (ans[n]) n++; // 从高位到低位输出 for (int i = n - 1; i >= 0; i--) cout << ans[i]; return 0; }复杂度分析
判断回文要比较 len/2 次,计算 a+a 要扫一遍,时间复杂度 O(len);额外空间复杂度 O(len)。
- 判断回文:把第 1 个字符和最后一个比、第 2 个和倒数第 2 个比……如果全相等就是回文数,输出
- 1