我遇到了这样的问题: -
A palindromic number reads the same both ways. The largest palindrome made from the product of two 2-digit numbers is 9009 = 91 × 99.
Find the largest palindrome made from the product of two 3-digit numbers.
解决问题我写了这样一个程序:
public void palindrome(){
int n=0;
for (int i = 100; i < 999; i++) { // I belive that largest palindrome is between 100 and 999
for (int j = 100; j <999; j++) {
n=i*j;
if(n>100000){
if(n/100000==n%10){
if(n/10000-(n/100000)*10==(n%100)/10){
if(n/1000-(n/10000)*10==(n%1000)/100){
System.out.println(n);
}
}
}
}
}
}
}
但输出的是: - 580085 如果我像这样改变了循环
for (int i = 900; i < 999; i++) { // I belive that largest palindrome is between 900 and 999
for (int j = 900; j <999; j++) {
然后它得到了正确的答案,我无法理解这个程序的行为?
任何人都可以解释一下吗?
答案 0 :(得分:5)
你的算法错了。循环应该是这样的:
public void palindrome(){
int n=0,largest=0;
for (int i = 100; i <= 999; i++) { // I belive that largest palindrome is between 100 and 999
for (int j = i+1; j <=999; j++) {
n=i*j;
if(n>100000){
if(n/100000==n%10){//first and last
if((n/10000)%10==(n%100)/10){ //second and fifth
if((n/1000)%10==(n%1000)/100){ //third and fourth
if(n>largest) largest=n;
}
}
}
}
}
}
System.out.println(largest);
}
并不是你的算法错了,但我很确定它会两次输出相同的结果。当i = 993且j = 913且i = 913且j = 993时,您将看到结果。但在这种情况下,输出将按i的最大值排序,这不一定会产生最大的产品。 你当前的循环是排列,你需要组合来解决这个问题,即101 * 121等于121 * 101,不要重复相同的乘法两次。
答案 1 :(得分:3)
999 * 999 = 998001
580085小于998001所以我不明白为什么你认为这是一个错误的答案?
很可能它是一个正确的答案,只需从900到999循环,你只需从可能的集合中移除它,通过删除给出该结果的乘法的一侧或两侧。
请注意,为了正确,您应该使用&lt; = 999,而不是&lt; 999为999是有效值。
答案 2 :(得分:0)
可能是整数溢出。 Java中的整数不能超过2 ^ 32,如果是,它们会循环回到-2 ^ 32。建议您使用Longs来处理大数(最多2 ^ 64),或BigInteger
如果您的数字超出该数字。
答案 3 :(得分:0)
正如Tim B所说,在运行你的程序后,我也得到 580085 而没有负号,这是一个有效值。
此外,您的代码将输出所有回文值,而不仅是最大值。在第一种情况下,您的上一个值是 580085
减少循环范围时,最后一个值是最大的 906609
因此,您应该检查当前计算的回文数是否大于最新数据。
这将为您提供两个循环的正确答案。