项目欧拉#4最大的回文产品

时间:2016-10-10 18:03:48

标签: java

我们试图找到通过乘以两个3位数字生成的最大回文数。回文数是从两侧读取的回文数(例如:12345654321或简称为9009)。 下面的代码编译正确,但显然有一个逻辑错误,因为当它应该是906609时输出是749947。如果有人可以帮助解释我在哪里得到这个问题错误的逻辑将是伟大的。

input.textfill {
  float: right;
}

3 个答案:

答案 0 :(得分:0)

906609  =  3 * 11 * 83 * 331  =  2739 * 331  =  913 * 993  =  ...

您的代码解析为buffer = 331, total = 2739,但if声明失败。

建议:不是检查998001到10000之间的所有数字,而是尝试查找乘以该数字的3位数值,而是使用3位数的双for循环数字并找到也是回文的最大产品。

答案 1 :(得分:0)

这种方法更易于遵循,并且有效。

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class Palindrome
{
  private static List<Integer> palindromes = new ArrayList<Integer>();

  public static void main(String[] args)
  {
    for (int i = 999; i > 99; i--)
    {
      for (int j = 999; j > 99; j--)
      {
        if (isPalendrome(i * j))
        {
          palindromes.add(i * j);
        }
      }
    }
    if (!palindromes.isEmpty())
    {
      Collections.sort(palindromes);
      System.out.println(palindromes.get(palindromes.size() - 1));
    }
  }

  private static boolean isPalendrome(int number)
  {
    char[] word = String.valueOf(number).toCharArray();
    int i1 = 0;
    int i2 = word.length - 1;
    while (i2 > i1)
    {
      if (word[i1] != word[i2])
      {
        return false;
      }
      ++i1;
      --i2;
    }
    return true;
  }
}

答案 2 :(得分:0)

嗯,你应该更容易解释编写代码,但我们必须回到其中的推理。外环采用蛮力方法,检查回文模式的所有数字,然后应用内部测试。

内心的考验是事情出错的地方。它试图变得聪明,但却产生了逻辑错误。我认为它试图将buffertotal中的数字分解为两个三位数字。但是,它只会在以后检查它们是三位数;计算它们时不考虑此规则。

k用作从buffer转移到total的潜在因素。每个号码都会被检查一次,不包括任何具有方波或更高功率因数的数字。更重要的是,在这种情况下,它们会从低到高进行检查,直到total不再小于buffer。那么906609会发生什么?

(%i1) factor(906609);
(%o1) 3 11 83 331

算法结算为3 * 11 * 83 * 331,但3 * 11 * 83 = 2739,因此错误的位数。所寻求的答案使用不同的因素分组:3 * 331 * 11 * 83。分解方法是可行的,但您需要检查因素的分组,这些因素反过来会产生三位数产品。