2013-12-08 2 views
0

현재 project euler(11)을 (를) 실행하려고 시도 중이고 테스트를 통해 문제가 발생했습니다.루프가 제대로 작동하지 않습니까? 또는 배열?

현재 텍스트 문서 대신 1에서 400까지의 숫자를 사용하고 있습니다. 그러나, 내가 프로그램을 실행할 때, 결과는 400 * 399가 아니다. * 396, 그것은 어이없는 숫자가 적다. 나는 내가 모자를 씌우는 문제가 int에 있다고 생각한다. 그러나 내가 현재 long으로 전환했을 때 여전히 음수를보고합니다. 분명히 결과가 범위를 벗어납니다.

모든 도움을 주시면 감사하겠습니다.

public class Euler11 
{ 
    public static void main(String[] args) 
    { 
     int[][] nums = new int[20][20]; 
     int v = 0; 
     int h = 0; 
     long high = 0; 
     for(int i = 1; i <= 400; i++) 
     { 
      nums[h][v] = i;// replace i with reader 
      if(h == 19) 
      { 
       h = 0; 
       v++ ; 
      } 
      else 
      { 
       h++ ; 
      } 
     } 

     for(int y = 0; y <= 15; y++) 
     { 
      for(int x = 0; x <= 19; x++) 
      { 
       high = higher(high, nums[y][x], nums[y + 1][x], nums[y + 2][x], 
         nums[y + 3][x], nums[y + 4][x]); 
      } 
     } 

     System.out.print(high); 
    } 

    public static long higher(long high, int n1, int n2, int n3, int n4, int n5) 
    { 
     System.out.println(n1 + " " + n2 + " " + n3 + " " + n4 + " " + n5 
     + " = " + (n1 * n2 * n3 * n4 * n5)); 
     if(n1 * n2 * n3 * n4 * n5 > high) 
     { 
      //System.out.println(n1 + " " + n2 + " " + n3 + " " + n4 + " " + n5 
        //+ " = " + (n1 * n2 * n3 * n4 * n5)); 
      return (n1 * n2 * n3 * n4 * n5); 
     } 
     else 
     { 
     return high; 
     } 
    } 

} 

감사합니다. 이제 프로그램이 작동합니다. 방금 모든 것을 만들었습니다. long 다음 필요할 때 int으로 전송하십시오.

+3

코드가 너무 많음 ... –

+0

문제의 원인이되는 코드 부분을 잘라낼 수 있습니까? –

답변

0

반환 유형이 길어도 n1 * n2 * n3 * n4 * n5는 정수입니다. 프로세스에서 너무 늦게 변환 될 가능성이 높습니다. 오버플로가 이미 발생했습니다.

항상 긴 시간 동안 작업하거나 오버플로 가능성이 있기 전에 long으로 변환되었는지 확인하십시오.

0

int가 아닌 long을 사용하십시오. 400 * 399 * ... * 396이 너무 커서 32 비트 정수에 맞지 않으므로 정수가 오버플로됩니다.

관련 문제