You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SPOJ下一个回文数问题代码提交失败,请求排查原因

问题分析与解决方案

你遇到的Wrong Answer核心原因是数据类型完全无法处理题目要求的超长数字,再加上逐个递增判断的效率问题(不过当前WA主要是前者),下面详细拆解并给出修复方案:

主要错误点

  • 数据类型溢出:题目明确K可以是多达1,000,000位的正整数,但你用int存储它——int的最大值通常是2147483647(仅10位),输入超过10位的数字时,cin >> x会直接读取失败,导致后续逻辑全错,这是WA的直接原因。
  • 低效的回文查找逻辑:即使数据类型没问题,逐个加1判断回文的方式对于超长数字来说会超时,比如输入全9的1e6位数字,这种方法需要循环到1000...001,完全不符合时间要求。

修复后的代码(基于字符串处理)

我们改用字符串存储数字,实现字符串的加1操作和高效的回文生成算法(而非逐个递增):

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;

// 判断字符串是否为回文
bool isPalindrome(const string &s) {
    int left = 0, right = s.size() - 1;
    while (left < right) {
        if (s[left] != s[right]) {
            return false;
        }
        left++;
        right--;
    }
    return true;
}

// 字符串数字加1,处理进位
string incrementString(string s) {
    int n = s.size() - 1;
    while (n >= 0 && s[n] == '9') {
        s[n] = '0';
        n--;
    }
    if (n < 0) {
        // 所有位都是9,比如"999"变成"1000"
        s = "1" + s;
    } else {
        s[n]++;
    }
    return s;
}

// 高效生成下一个回文数的核心函数
string nextPalindrome(string s) {
    int n = s.size();
    string half = s.substr(0, (n + 1) / 2);
    string palindrome = half;
    // 反转前半部分的对应长度,拼接成回文
    string reversedHalf = half.substr(0, n / 2);
    reverse(reversedHalf.begin(), reversedHalf.end());
    palindrome += reversedHalf;

    // 如果生成的回文比当前数大,直接返回
    if (palindrome > s) {
        return palindrome;
    }

    // 否则,前半部分加1后再生成回文
    half = incrementString(half);
    palindrome = half;
    reversedHalf = half.substr(0, n / 2);
    reverse(reversedHalf.begin(), reversedHalf.end());
    palindrome += reversedHalf;
    return palindrome;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int t;
    cin >> t;
    while (t--) {
        string k;
        cin >> k;
        // 先对原数加1,满足题目"即使K是回文也要输出下一个"的要求
        string k_plus_1 = incrementString(k);
        string result = nextPalindrome(k_plus_1);
        cout << result << '\n';
    }
    return 0;
}

代码说明

  1. 字符串存储与加1:用string处理超长数字,incrementString函数模拟手动加1的逻辑,完美处理进位和全9的边界情况。
  2. 高效回文生成:
    • 取数字的前半部分,反转后拼接成候选回文数
    • 如果候选回文数比加1后的原数大,直接返回
    • 如果不够大,就把前半部分加1后再拼接回文,一步到位避免逐个递增的低效
  3. IO优化:ios::sync_with_stdio(false)和cin.tie(nullptr)是为了提升超大输入下的读取速度,避免超时。

原代码WA的具体场景

比如输入9999999999(10位,刚好超过int的最大值),你的代码中cin >> x会读取失败,x的值会变成一个错误的垃圾值,后续的x+1和回文判断全错,直接输出错误结果,导致网站判定Wrong Answer。

内容的提问来源于stack exchange,提问作者Jester

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:40:04