ProjectEuler最大回文乘积问题:Java代码输出0求助
问题分析与修复
嘿,我一眼就揪出代码里的关键问题啦,这也是很多新手容易踩的循环陷阱!
核心问题:内层循环变量未重置
你只在代码开头初始化了j = 999,但外层循环每一次i递减时,j并没有被重新设回999。第一次外层循环(i=999)执行完后,j已经变成了99,之后所有i的循环里,内层循环的条件j >= 100都不满足,直接跳过——这就导致程序只检查了i=999时的乘积,没覆盖到其他三位数的组合,最终pal一直是初始值0。
次要优化:冗余的类型转换
你已经通过k = i*j得到了乘积的数值,没必要把字符串normal再转成Long来比较,直接用k > pal就可以,既简洁又避免额外的类型转换开销。
修正后的代码
public class LargestPalindromeProduct { public static void main(String[] args) { long i = 999; long pal = 0; for (; i >= 100; i--) { // 每次外层循环都重置j为999,确保内层循环能完整执行 long j = 999; for (; j >= 100; j--) { long k = i * j; String normal = String.valueOf(k); String palindrome = new StringBuffer(normal).reverse().toString(); if (normal.equals(palindrome)) { if (k > pal) { pal = k; } } } } System.out.println(pal); } }
额外小建议
其实判断回文数可以不用转字符串,用数值反转的方式效率更高,比如:
private static boolean isPalindrome(long num) { long original = num; long reversed = 0; while (num > 0) { reversed = reversed * 10 + num % 10; num /= 10; } return original == reversed; }
把这段逻辑替换掉字符串反转的部分,程序运行速度会更快哦~
内容的提问来源于stack exchange,提问作者RA3236
相关产品推荐
相关产品推荐

