2013-12-08 3 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 является целым числом. Скорее всего, вы переходите к слишком поздно, и переполнение уже произошло.

Либо работайте в течение долгого времени, либо убедитесь, что вы перешли к длинным перед любой возможностью переполнения.

0

Использование длинного, а не ints. 400 * 399 * ... * 396 слишком велика, чтобы вставлять 32-битный int, и поэтому у вас есть целочисленное переполнение.

Смежные вопросы