【问题标题】:Why does my program not work as expected?为什么我的程序没有按预期工作?
【发布时间】:2015-03-08 10:15:14
【问题描述】:

我正在研究 Euler 项目的第十二题。都是关于三角形数的;我试图找到第一个具有 500 多个除数的三角形数。我写了一个程序来找到这个,但是,它没有给我正确的答案,我不明白为什么。我在下面提供了我的代码:

public class problemTwelve {
  public static void main(String [] args) {
    int i = 1;
    int number = 1;
   while(getDivisors(number) < 500) {
     number += i;
     i++;
   }
   System.out.println("The first triangle number to have greater than 500 divisors is: " + number);
  }

  private static int getDivisors(int triangleNum) {
    int noOfDivisors = 0;
    int numToTest = (int) Math.sqrt(triangleNum);
    for(int i = 1; i <= numToTest; i++) {
      if((triangleNum % i) == 0) {
        noOfDivisors += 2;
      }
    }
    if((numToTest * numToTest) == triangleNum) {
      noOfDivisors--;
    }
    return noOfDivisors;
  }
}

程序运行后给出的输出如下:

第一个大于 500 个除数的三角形数是:146611080

在项目 Euler 上输入这个数字作为答案后,我们可以看到它是错误的。我不知道我的程序哪里出错了......

【问题讨论】:

  • 你应该将number初始化为0

标签: java loops integer


【解决方案1】:

您检查的数字似乎不是三角形。看代码,第二个检查的数字是2,不是三角形数。

尝试移动线

i++;
行前
number+=i;

【讨论】:

    【解决方案2】:

    你必须从 0 而不是 1 开始你的数字,这是正确的代码:

    int i = 1;
        int number = 0;
        while(getDivisors(number) < 500) {
            number += i;
            i++;
        }
        System.out.println("The first triangle number to have greater than 500 divisors is: " + number);
    }
    
    
    private static int getDivisors(int triangleNum) {
        int noOfDivisors = 0;
        int numToTest = (int) Math.sqrt(triangleNum);
        for(int i = 1; i <= numToTest; i++) {
            if(triangleNum % i == 0) {
                noOfDivisors += 2;
            }
        }
        if((numToTest * numToTest) == triangleNum) {
            noOfDivisors--;
        }
        return noOfDivisors;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-29
      • 1970-01-01
      • 2019-08-28
      • 2014-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-04
      相关资源
      最近更新 更多