三位因数最大回文数查找函数未返回正确结果,求调试
问题分析与调试建议
你的代码能找到回文数,但不是最大值的核心原因是:代码在找到第一个满足条件的回文数后就立刻终止了所有循环,而第一个遇到的回文数并非所有三位因数乘积中的最大值。
具体问题点
你在嵌套循环中,只要发现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
相关产品推荐
相关产品推荐

