我正在通过Project Euler工作,而对于问题4,我的回文代码并没有工作。具体来说,它返回998001(999 * 999),好像它是回文。
检查回文的代码有效,但它保持循环并替换最大值,尽管它不是回文。我错过了什么?
感谢您的帮助
public int palindromeNumber()
{
int max=0;
for(int x = 100; x<1000; x++)
{
for(int y = 100; y<1000; y++)
{
int z = x*y;
StringBuilder num = new StringBuilder(Integer.toString(z));
StringBuilder rev = num.reverse();
if(num==rev)
{
max=z;
}
}
}
return max;
}
答案 0 :(得分:5)
如果您查看StringBuilder.reverse()方法,它会返回对同一对象的引用(在您的情况下为num)
@Override
public StringBuilder reverse() {
super.reverse();
return this;
}
所以你的rev == num总是如此,你得到999 * 999,因为它是一个循环的结束
答案 1 :(得分:4)
您的代码是正确的,但正如评论所指出的那样,您正在比较地址而不是字符串。
String是一个对象,而不是一个原始类型,因此当你比较原始和反向时,'=='
将不起作用。
相反,您需要使用.equals(String)
方法。
这是一个单行证明的概念:
max = (num.equals(new StringBuilder(Integer.toString(z)).reverse())) ? z : max;
注意:强>
出于性能原因,您可能希望尝试以数字方式实现此功能,转换和解析需要时间。
概念的快速证明:
num = origNum
while (num > 0)
{
digit = num % 10;
rev = rev * 10 + digit;
num = num / 10;
}
if (origNum == rev) //max..
答案 2 :(得分:0)
Please make some changes as -
public static int palindromeNumber()
{
int max=0;
for(int x = 100; x<1000; x++)
{
for(int y = 100; y<1000; y++)
{
int z = x*y;
StringBuilder num = new StringBuilder(Integer.toString(z));
StringBuilder numberCopy = new StringBuilder(num);
StringBuilder rev = num.reverse();
if(numberCopy.toString().equals(rev.toString()))
{
max=z;
}
}
}
return max;
}
代码中的问题是,当你使用rev = num.reverse(); 然后每次循环它用相反的数字修改相同的object-num,然后将其分配给rev。现在两个参考号和&amp; rev指向同一个修改过的对象。(上次迭代中num和rev值为999)
然后你使用==哪个检查引用指向同一个对象,这里num和rev指向同一个对象,所以每次条件都为真。
解决方案 -
在修改之前将对象复制到另一个对象,以后可以用于比较。
使用等于比较值==。