2016-07-19 1 views
0

프로젝트 오일러 문제 10을 풀고있었습니다. 삼각형 수열은 자연 수를 더함으로써 생성되었습니다. 따라서 7 번째 삼각형 수는 1 + 2 + 3 + 4 + 5 + 6 + 7 = 28이 될 것입니다. 첫 번째 삼각형 수의 값을 알아 내기 위해 500 개 이상의 제수를 구하십시오.int 값이 음수로 증가하고 주어진 루프를 중단하지 않는 이유는 무엇입니까?

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에 인쇄 문에 넣어 보려면 및 다음과 같은 결과를 얻었다 :

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)? 도와주세요!

+3

아마도 (while! n! = nextnum && DivCount! = 500)' – Eran

+0

런타임 예외로 수정되었습니다 ... – VMi

+0

숫자가 500 개 이하의 제수를 가질 수 있으며 nextnum은 여전히 ​​n 일 수 있습니다. 또한 나는 500 개의 약수가있는 첫 번째 숫자를 OR 조건으로 가져와야합니다. – VMi

답변

1

이유는 정수 오버플로가 발생하기 때문입니다.

루프를 실행하는 경우 (n = 36의 경우) nextnum = 36 (즉, nextnum = n) 일 때 DivCount = 9이 표시됩니다. 즉, 루프 은이 반복에서을 깨지 않습니다. 다른 모든 nextnum에서

거기 nextnum 오버 플로우 될 때까지 무한 루프로 이동하여 n 동일하고 예외가 발생하지 것입니다.

+0

DivCount = 6 일 때 nextnum이 주어진 삼각형 숫자 36에 대해 9 일 때 위에 주어진 결과에 따라 믿습니다. – VMi

+0

@VMi, correct를 입력하십시오. DivCount = 9 일 때 nextnum은 36이됩니다. – Codebender

+0

합의했는데 왜 루프가 깨지지 않습니까? – VMi

0

아직 댓글을 달 수 없기 때문에 답변을 게시해야합니다. 다음과 같이 추가하고 싶습니다. 정말 큰 숫자가 필요하면 BigInteger/BigDecimal 등으로 작업해야합니다. 작업을 처리하는 데 더 어려운 코드가 필요합니다. 그러나 그것은 해결책입니다.

관련 문제