为什么我的程序没有按预期工作?

时间:2015-03-08 10:15:14

标签: java loops integer

我正在研究Euler项目中的第12个问题。这完全是关于三角形数字;我试图找到超过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的答案,我们可以看出它是错误的。我不知道我的课程在哪里出错...

2 个答案:

答案 0 :(得分:1)

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

尝试在行

i++;

之前移动

number+=i;

答案 1 :(得分:0)

你必须从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;
}