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

三位因数最大回文数查找函数未返回正确结果,求调试

问题分析与调试建议

你的代码能找到回文数,但不是最大值的核心原因是:代码在找到第一个满足条件的回文数后就立刻终止了所有循环,而第一个遇到的回文数并非所有三位因数乘积中的最大值。

具体问题点

你在嵌套循环中,只要发现i*j是回文数,就通过goto end_loop直接跳出所有循环,停止后续遍历。但实际上,更大的回文数可能出现在后续的循环迭代中(比如更小的i搭配合适的j,乘积反而更大)。

调试方向

不需要完全移除goto,但需要调整逻辑:

  • 初始化一个变量记录当前找到的最大回文数(比如int max_pal = 0)
  • 遍历所有可能的三位因数组合时,每找到一个回文数,先计算其乘积current = i*j
  • 如果current大于max_pal,就更新max_pal以及对应的factorI和factorJ
  • 遍历完所有组合后,再输出最终记录的最大值和因数

代码调整示例(仅修改核心逻辑,保留你的原有风格)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int isPalindrome(int number) {
    int palindrome = 1;
    char *str = (char *)malloc(8 * sizeof(char));
    sprintf(str, "%d", number);
    int len = strlen(str);
    for (int i = 0; i < len; i++) {
        if ((str[i] == str[len - (i+1)]) && palindrome) continue;
        else palindrome = 0;
    }
    free(str);
    return palindrome;
}

int main(void) {
    char* omg = "\xF0\x9F\x98\xB2";
    int factorI = 0;
    int factorJ = 0;
    int max_pal = 0; // 新增:记录最大回文数

    for (int i = 999; i >= 100; i--) {
        for (int j = 999; j >= 100; j--) {
            int current = i * j;
            if (isPalindrome(current)) {
                // 仅当当前乘积更大时,更新记录
                if (current > max_pal) {
                    max_pal = current;
                    factorI = i;
                    factorJ = j;
                }
                // 优化:j递减,当前i下第一个回文数是该i对应的最大乘积,可直接跳出内层循环
                break;
            }
        }
    }

    printf("Done! Found palindrome. (%s%s%s)\n", omg, omg, omg);
    printf("i: %d\nj: %d\n", factorI, factorJ);
    printf("PALINDROME: %d", max_pal);
    printf("\n\nHello World\n");
    return 0;
}

额外优化说明

内层循环中,当找到第一个回文数后可以直接break,因为j是从大到小遍历的,此时的i*j是当前i能得到的最大回文数,无需继续往下找更小的j,这样能减少不必要的计算。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 14:57:01