【问题标题】:Why does int value increment to negative and not break given loop?为什么 int 值递增为负而不破坏给定循环?
【发布时间】:2016-07-19 09:29:37
【问题描述】:

我正在解决 Project Euler 的第 10 题,三角形数的序列是通过添加自然数生成的。所以第7个三角形数是1 + 2 + 3 + 4 + 5 + 6 + 7 = 28,要找到第一个三角形数的值有超过五百个除数?

我写了以下程序:

public class ProjectEulerProb12HighestDivisorTriangNumb {

  public static void main(String[] args) {

    int minLim = 7; //As seven is already given in prob statement
    System.out.println(
        "The first triangular no to have more than 500 divisors is " + getNaturalnumb(minLim));
  }

  public static int getNaturalnumb(int natNum) {
    int div = 1, TrianNum = 1;

    while (div <= 500) {
      natNum++;
      TrianNum = getTrianNum(natNum);
      div = getDivCount(TrianNum);
    }

    return TrianNum;
  }

  public static int getTrianNum(int n) { //Generating Triangular Number for any Natural no. n
    int TrianNum = 0;

    for (int i = 1; i <= n; i++) {
      TrianNum += i;
    }
    System.out.println(" The current TrianNum is " + TrianNum);
    return TrianNum;
  }

  public static int getDivCount(int n) {// Getting Divisor count for any Triangular no. n

    int DivCount = 1, nextnum = 1;

    while (n != nextnum || DivCount != 500) {
      if (n % nextnum == 0) {
        System.out.println(
            " The current n is "
                + n
                + " Current nextnum is "
                + nextnum
                + " current Divcount is "
                + DivCount);
        DivCount++;
      }

      nextnum++;
    }

    return DivCount;
  }
}

我得到以下运行时异常:

    Exception in thread "main" java.lang.ArithmeticException: / by zero
at ProjectEulerProb12HighestDivisorTriangNumb.getDivCount(ProjectEulerProb12HighestDivisorTriangNumb.java:47)
at ProjectEulerProb12HighestDivisorTriangNumb.getNaturalnumb(ProjectEulerProb12HighestDivisorTriangNumb.java:20)
at ProjectEulerProb12HighestDivisorTriangNumb.main(ProjectEulerProb12HighestDivisorTriangNumb.java:8)

为了查看我错在哪里,我在方法 getDivCount 中输入了 print 语句并得到以下输出:

    The current TrianNum is 36
    The current n is 36 Current nextnum is 1 current Divcount is 1
    The current n is 36 Current nextnum is 2 current Divcount is 2
    The current n is 36 Current nextnum is 3 current Divcount is 3
    The current n is 36 Current nextnum is 4 current Divcount is 4
    The current n is 36 Current nextnum is 6 current Divcount is 5
    The current n is 36 Current nextnum is 9 current Divcount is 6
    The current n is 36 Current nextnum is 12 current Divcount is 7
    The current n is 36 Current nextnum is 18 current Divcount is 8
    The current n is 36 Current nextnum is 36 current Divcount is 9
    The current n is 36 Current nextnum is -36 current Divcount is 10
    The current n is 36 Current nextnum is -18 current Divcount is 11
    The current n is 36 Current nextnum is -12 current Divcount is 12
    The current n is 36 Current nextnum is -9 current Divcount is 13
    The current n is 36 Current nextnum is -6 current Divcount is 14
    The current n is 36 Current nextnum is -4 current Divcount is 15
    The current n is 36 Current nextnum is -3 current Divcount is 16
    The current n is 36 Current nextnum is -2 current Divcount is 17
    The current n is 36 Current nextnum is -1 current Divcount is 18

    Exception in thread "main" java.lang.ArithmeticException: / by zero

为什么 int 值在满足条件 (n!=nextnum) 后会增加到负数?救命!

【问题讨论】:

  • 也许你想要while (n!=nextnum &amp;&amp; DivCount!=500)
  • 更正为运行时异常...
  • No Eran,一个数可以有少于 500 个除数,但 nextnum 仍然可以是 =n。另外,因为我需要获得第一个数字才能有 500 个除数,所以 OR 条件。
  • @VMi 那么你不能指望在 n==nextnum 的时候跳出循环。
  • True || False = True 所以你不能跳出循环,直到两个条件都为假

标签: java


【解决方案1】:

原因是您遇到了整数溢出。

如果你遍历你的循环(对于n = 36),你会注意到DivCount = 9 当你的nextnum = 36(即nextnum = n)。这意味着循环在此迭代中不会中断

在所有其他 nextnum 等于 n 进入无限循环,直到您的 nextnum 溢出并引发异常。

【讨论】:

  • 我相信,根据上面给出的结果,当 DivCount = 6 时,对于给定的三角形数 36,nextnum 是 9。
  • @VMi,输入正确。当 DivCount = 9 时,nextnum 将为 36。
  • 同意..但为什么不打破循环?
【解决方案2】:

由于我还不能发表评论,所以我必须发布一个答案。 我想补充一点:如果您需要非常大的数字,则需要使用 BigInteger / BigDecimal 等 - 这也需要更难的代码来处理操作。但这是一个解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-14
    • 1970-01-01
    • 2020-10-04
    • 1970-01-01
    • 1970-01-01
    • 2021-10-28
    • 1970-01-01
    相关资源
    最近更新 更多