当前位置: 首页 > 知识库问答 >
问题:

我如何在没有暴力的情况下完成Euler 5?

葛志国
2023-03-14

在我当前的项目Euler问题5中,我有一个“有效”的解决方案。它适用于较小的数字(问题中的示例一),但不适用于实际问题,因为我在强行执行它,并且程序没有完成。

以下是问题的解释:

2520是可以被1到10中的每一个数字除以而没有任何余数的最小数字。

可以被1到20的所有数字整除的最小正数是多少?

1:可分无余数

这是我当前的代码:

package Euler;

public class Euler5 {

  public static void main(String[] args) {
    int desiredNumber = 20;
    boolean exitLoop = false;
    long counter = 1;

    while(exitLoop == false) {
        long loopCounter = 0;
        for(int i=1; i<=desiredNumber; i++) {
            if(counter % i == 0) {
                loopCounter++;
            }
        }
        if(loopCounter == desiredNumber) {
            exitLoop = true;
            System.out.println(counter);
        }
        counter++;
      }
  }
}

共有2个答案

颜修明
2023-03-14

您正在寻找的数字是1,2,3,...,20数字的最小公倍数(LCM)。

通过将每个数字拆分为其素因子的乘积(对于小数字来说很容易),找到LCM相当容易。

徐麒
2023-03-14

你没有电脑来回答这个问题。看:如果一个数字可以被1到20中的每个数字除以,这意味着它应该是相应幂的素数的乘法:

   2**4 (from 16) 
   3**2 (from 9)
   5
   7
  11 
  13
  17
  19

所以解决方案是

  16 * 9 * 5 * 7 * 11 * 13 * 17 * 19 == 232792560

由于答案相当大,我怀疑蛮力在这里是否是一种合理的方法。

在一般情况下(对于某些<代码>n

  2, 3, ..., m (m <= n)

然后,对于每个素数a,求出幂pa,使得

<代码>a**pa

但是

<代码>a**(pa 1)

答案将会是

2**p2*3**p3*...*m**pm

可能的Java实施:

  public static BigInteger evenlyDivisible(int n) {
    if (n <= 0)
      throw new IllegalArgumentException("n must be positive");
    else if (n <= 2)
      return BigInteger.valueOf(n);

    ArrayList<Integer> primes = new ArrayList<Integer>();

    primes.add(2);

    for (int i = 3; i <= n; i += 2) {
      boolean isPrime = true;

      for (int p : primes) {
        if (i % p == 0) {
          isPrime = false;

          break;
        }
        else if (p * p > i)
          break;
      }

      if (isPrime)
        primes.add(i);
    }

    BigInteger result = BigInteger.ONE;

    for(int p : primes) {
      // Simplest implemenation, check for round up errors however
      int power = (int)(Math.log(n) / Math.log(p));

      result = result.multiply(BigInteger.valueOf(p).pow(power));
    }

    return result;
  }

...

  System.out.println(evenlyDivisible(20)); // 232792560
 类似资料:
  • 我想为OpenComputers(minecraft mod)编写一个曼卡拉游戏,它使用Lua。然而,曼卡拉要求必须进入它中间的主循环(六个可供选择的壶),退出中间的循环(把你的最后一个石头放入空壶),从循环内部进入循环(把最后一个石头放入壶中,必须从那个壶中捡起所有的石头)。 我可以很容易地在两边做曼卡拉,用一个boolean值和一个if语句。 对于不熟悉曼卡拉的人,我有一个快速的流程图来解释我

  • 问题内容: 我正在尝试设置spring xml配置,而不必创建进一步的。但是,即使我将数据库属性包括在 spring.xml: 我在这里想念什么? 问题答案: 在entityManagerFactory bean定义中指定“ packagesToScan”和“ persistenceUnitName”属性。 请注意,这适用于Spring版本> 3.1

  • 问题内容: 我正在学习使用Selenium(v2.20)来领先一些 即将使用它创建浏览器测试的程序员。我想在 陷阱到达之前发现它们,而我却跌入了一个陷阱。 当我创建ChromeDriver时,它始终会弹出“ Google Chrome EULA”并 显示两个按钮:“接受并运行”和“取消”。因为我希望这是一个 自动化测试,所以让用户单击按钮是不可能的。 我查看了Chromium CommandSwi

  • 问题内容: 该代码选择同一文件夹中的所有xml文件,作为被调用的可执行文件,并以异步方式将处​​理应用于回调方法中的每个结果(在下面的示例中,仅打印文件名)。 如何避免使用sleep方法阻止main方法退出?我在解决问题时遇到了麻烦(我想这就是同步结果所必需的),因此,我们将不胜感激! 问题答案: 您可以使用sync.WaitGroup。引用链接的示例:

  • 我已经安装了Android SDK最新版本和Eclipse。但我也想试试Android Studio。 我看过这个和这个帖子,但是那些解决方案改变了Android Studio(一旦下载并安装)使用的SDK实例。我想要的不是下载另一个SDK,当我已经在我的机器上安装了它。

  • 问题内容: 我想知道如何在Spring MVC上引导我的应用程序? 我有一个初始化器: 我知道我们为什么需要以及如何使用它来引导应用程序。但是我不明白,如果没有文件(只有),怎么知道应该使用哪个servlet来引导应用程序? 依存关系 我在Spring核心中找到了此类。使用它来引导我的应用程序是否正确? http://docs.oracle.com/javaee/7/api/javax/servl