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:用
string处理超长数字,incrementString函数模拟手动加1的逻辑,完美处理进位和全9的边界情况。 - 高效回文生成:
- 取数字的前半部分,反转后拼接成候选回文数
- 如果候选回文数比加1后的原数大,直接返回
- 如果不够大,就把前半部分加1后再拼接回文,一步到位避免逐个递增的低效
- IO优化:
ios::sync_with_stdio(false)和cin.tie(nullptr)是为了提升超大输入下的读取速度,避免超时。
原代码WA的具体场景
比如输入9999999999(10位,刚好超过int的最大值),你的代码中cin >> x会读取失败,x的值会变成一个错误的垃圾值,后续的x+1和回文判断全错,直接输出错误结果,导致网站判定Wrong Answer。
内容的提问来源于stack exchange,提问作者Jester
相关产品推荐
相关产品推荐

