【问题标题】:Palindrome program, cannot terminate loop, Project Euler #4回文程序,不能终止循环,欧拉计划 #4
【发布时间】:2014-01-05 22:39:43
【问题描述】:
import java.util.ArrayList;
public class Euler4{
    public static void main(String [] args){
                int size = 0;
        int product = 0;

        for(int i = 102; i > 100; i--){
            for(int j = 102; j > 100; j--){
                ArrayList<Integer> digits = new ArrayList<Integer>();
                product = i*j;
                int index = 0;
                while(product > 0){
                    digits.add(index,product%10);
                    product /= 10;
                    index++;
                }
                for(int element : digits)
                    System.out.println("digits :" + element);   
                size = digits.size() - 1;

                if(test(0,size,digits)){
                    System.out.println("i and j " + i + " " + j);
                    break;  
                }
            }
        }
    }

    public static boolean test(int i, int size, ArrayList<Integer> digits){

        if(digits.get(size).equals(digits.get(i))){

            if(size == i || size - i == 1){
                return true;

            }else{
                System.out.println("i: " + i + " size: " + size + " digits@i: " + digits.get(i) +" digits@size " + digits.get(i));
                size--;
                i++;

                if(!test(i, size, digits))  
                    return false;
            }   
        }
        return false;
    }
}

这是输出:

digits :4 index: 0
digits :0 index: 1
digits :4 index: 2
digits :0 index: 3
digits :1 index: 4
digits :2 index: 0
digits :0 index: 1
digits :3 index: 2
digits :0 index: 3
digits :1 index: 4
digits :2 index: 0
digits :0 index: 1
digits :3 index: 2
digits :0 index: 3
digits :1 index: 4
digits :1 index: 0
digits :0 index: 1
digits :2 index: 2
digits :0 index: 3
digits :1 index: 4
i: 0 size: 4 digits@i: 1 digits@size 1
i: 1 size: 3 digits@i: 0 digits@size 0

我认为while循环和递归都有问题。通过 test() 方法运行的值是进入数组的最后一组值,即 10201,因此即使 while 循环搞砸了,递归方法仍然应该返回 true。我不知道为什么不是。

这就是问题所在: http://projecteuler.net/problem=4

谢谢。

编辑:我将其修复为更高效并提供最大回文数,而不仅仅是列出回文数。如果有人感兴趣,这里是决赛:http://pastebin.com/qJUpZVzK

【问题讨论】:

  • 这是欧拉计划,第 4 题吗?如果是这样,你应该在问题中这么说。如果没有,你应该避免调用你的类Euler4,这会导致错误的假设。
  • 好吧,我去改一下。
  • 考虑使用堆栈来检测回文,如果字符串 == 堆栈则它是回文。
  • 您的数字问题是使用除以 10 的余数,这会产生奇怪的结果。例如 1002 % 10 = 2, 1001 % 10 = 1, 1000 % 10 = 0。对 String 使用对数或转换数并存储其长度。例如,请参阅this ideone clip
  • @t0mppa:对,但这不是我想要的吗?我用模数得到最后一个数字,然后用除法去掉最后一个数字。问题似乎在于 while 循环条件。

标签: java loops recursion


【解决方案1】:

您对test 的第三次调用返回true,但您对test 的第二次调用未使用该值。当您实际上希望它返回 true 时,它正在下降到方法的底部并返回 false

当您递归调用test 时,如果递归调用返回true,您希望返回true(来自test)。

改变

if(!test(i, size, digits))  
      return false;

靠近底部,到

return test(i, size, digits);

【讨论】:

    【解决方案2】:

    您的循环永远不会达到 0,因为条件总是会得到满足。

                while(product > 0){
                    digits.add(index,product%10);
                    product /= 10;
                    index++;
                }
    

    说实话,我认为检查回文的最简单方法是:

    public boolean palindrome (int n) {
        return String.valueOf(n).equals(new StringBuilder(String.valueOf(n)).reverse().toString());
    }
    

    【讨论】:

      【解决方案3】:

      问题出在这里:

      while(product > 0){
          digits.add(index,product%10);
          product /= 10;
          index++;
      }
      

      product 永远不能通过除以 10 减少为负数(小于 0);这意味着你永远不会退出这个 while 循环。让我们进一步看一下:

      1- product is created and it's value is 102*102=10404. (The first time through the for loops.)
      2- product is divided by 10 to get 1040.4
      3- While loop is checked, 1040.4 > 0, enter again.
      4- product is divided by 10 to get 104.04
      5- While loop is checked, 104.04 > 0, enter again.
      

      无限重复第 4 步和第 5 步,因为即使你一直在 1 以下除,它也总是在 0 以上。(例如 0.0000000000000010404 > 0)

      【讨论】:

      • 但是当整数相除时,它们会忽略小数。另外,数组索引不会无限继续吗?在这种情况下,数组到达索引 4,然后从索引 0 开始重复。
      • 哼...抓住了我。继续。 :P
      猜你喜欢
      • 1970-01-01
      • 2016-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多