Java代码问题:求解ProjectEuler第4题为何结果不正确?
你的代码问题分析
咱们直接拆解你代码里的核心问题:
最关键的错误:没有保留最大的回文数
你的逻辑是「只要找到回文数,就直接把finalSum替换成这个数」,完全没管这个新回文数是不是比之前的更大。比如,循环后期如果遇到一个较小的回文数(比如某个三位数乘积得到的10201之后,又碰到了9009),它会直接把finalSum改成更小的那个值,最后输出的是最后一个遍历到的回文数,而不是所有回文数里最大的那个。对比正确代码的逻辑
网上的正确代码(其实它的写法有个小瑕疵,应该先判断是否是回文再比大小,但核心思路没问题):它先筛选出比当前记录的最大值更大的乘积,再判断这个乘积是不是回文——只有满足「更大+是回文」两个条件,才更新最大值,这样就能保证最后留下的是所有可能里最大的那个回文数。
修正你的代码的方法
只需要给你的判断条件加一个「当前回文数比finalSum大」的限制,就能解决问题:
public static long reverseNumber(long number){ long reversed = 0; while(number != 0) { long digit = number % 10; reversed = reversed * 10 + digit; number /= 10; } return reversed; } // 主逻辑部分 long sum, finalSum = 1, revSum; for (int i = 100; i < 1000; i++){ for (int j = 100; j < 1000; j++){ sum = i * j; revSum = reverseNumber(sum); // 关键修改:只有当前回文数比已记录的最大值大,才更新 if (sum == revSum && sum > finalSum){ finalSum = sum; } } } System.out.println(finalSum);
另外给你提个小优化:可以让j从i开始循环(j = i; j < 1000; j++),因为i*j和j*i的结果完全一样,这样能减少一半的循环次数,提升代码效率。
内容的提问来源于stack exchange,提问作者Yash Wason
相关产品推荐
相关产品推荐

