Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 项目Euler#4最大回文产品_Java - Fatal编程技术网

Java 项目Euler#4最大回文产品

Java 项目Euler#4最大回文产品,java,Java,我们试图找到最大的回文数,它是由两个3位数的数字相乘生成的。回文数字是从两侧读取相同内容的数字(例如:12345654321或简称9009)。 下面的代码编译正确,但显然存在一个逻辑错误,因为输出是749947,而它应该是906609。如果有人能帮我解释一下我把这个问题弄错的原因,那就太好了 boolean valid = false; for (int i = 999*999; i > 100*100; i--) { if (i / 100000 == i % 10 &&am

我们试图找到最大的回文数,它是由两个3位数的数字相乘生成的。回文数字是从两侧读取相同内容的数字(例如:12345654321或简称9009)。 下面的代码编译正确,但显然存在一个逻辑错误,因为输出是749947,而它应该是906609。如果有人能帮我解释一下我把这个问题弄错的原因,那就太好了

boolean valid = false;
for (int i = 999*999; i > 100*100; i--) {
  if (i / 100000 == i % 10 &&
      i / 10000 % 10 == i / 10 % 10 &&
      i / 1000 % 10 == i / 100 % 10) {
        int buffer = i;
        int total = 1;
        for (int k = 2; k < buffer; k++) {
          if (buffer % k == 0) {
            buffer /= k;
            total *=k;
          }
        }
        if (buffer >= 100 && buffer < 1000 && total >=100 && total < 1000 ) {
          System.out.println(i);
          System.out.println(total);
          System.out.println(buffer);
          break;
        }
     }
    }
  }
}
boolean valid=false;
对于(int i=999*999;i>100*100;i--){
如果(i/100000)=i%10&&
i/10000%10==i/10%10&&
i/1000%10==i/100%10){
int缓冲区=i;
整数合计=1;
for(int k=2;k=100&&buffer<1000&&total>=100&&total<1000){
系统输出打印LN(i);
系统输出打印项次(总计);
系统输出打印项次(缓冲区);
打破
}
}
}
}
}
代码解析为
buffer=331,total=2739
,这使
if
语句失败


建议:不要检查从998001到10000的所有数字,并尝试查找相乘时产生数字的3位值,而是对3位数字的循环使用双
,并查找也是回文的最大乘积。

这种方法更容易遵循,而且有效

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;
  }
}
import java.util.ArrayList;
导入java.util.Collections;
导入java.util.List;
公共类回文
{
私有静态列表回文=新ArrayList();
公共静态void main(字符串[]args)
{
对于(int i=999;i>99;i--)
{
对于(int j=999;j>99;j--)
{
if(isPalendrome(i*j))
{
加上(i*j);
}
}
}
if(!palindromes.isEmpty())
{
集合。排序(回文);
System.out.println(palindromes.get(palindromes.size()-1));
}
}
私有静态布尔值isPalendrome(整数)
{
char[]word=String.valueOf(number).toCharArray();
int i1=0;
int i2=单词长度-1;
而(i2>i1)
{
如果(字[i1]!=字[i2])
{
返回false;
}
++i1;
--i2;
}
返回true;
}
}

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

内心的考验是事情出错的地方。它试图变得聪明,但却产生了一个逻辑错误。我看到它试图做的是将找到的数字分解为
缓冲区
总数
,它们是两个三位数的数字。然而,它只是在以后检查它们是否是三位数;它们的计算不考虑这一规则

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。因子分解方法是可行的,但您需要检查因子的分组,这些分组反过来会产生三位数的产品

当您在IDE中附加调试器并逐行浏览代码时,您观察到了什么?在没有实际分析您正在使用的litmus测试的情况下,我会问,您粘贴的代码段中的第一行代码的目的是什么?在litmus测试中测试逻辑的另一个提示是首先尝试一个更简单的测试,比如将i转换为一个等于自身的字符串
(%i1) factor(906609);
(%o1) 3 11 83 331