top1编程
← 返回题目
题解

回文数求和

1 条题解

  • 0
    @ 2026-8-3 18:39:20

    解题思路

    大整数 a 最多有 2000 位,分两步做:

    1. 判断回文:把第 1 个字符和最后一个比、第 2 个和倒数第 2 个比……如果全相等就是回文数,输出 YES。
    2. 不是回文:计算 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