2014-01-13 4 views
0

Мой код для поиска factorial для целых чисел до 100. Я использую BigInteger, но моя проблема в том, что мой HashMap не заполняется.Почему мой HashMap не заселен

public class FCTRL2 { 
static Map<Integer,BigInteger> list = new HashMap<Integer,BigInteger>(); 

    public static void main(String[] args){ 
     InputStreamReader read = new InputStreamReader(System.in); 
     BufferedReader in = new BufferedReader(read); 
     int numberOfInput=0; 
     String input=null; 
     try { 
      numberOfInput = Integer.parseInt(in.readLine()); 
     } catch (NumberFormatException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     while(numberOfInput > 0){ 
      try { 
       input = in.readLine(); 
      } catch (NumberFormatException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

      BigInteger inputBig = new BigInteger(input); 
      **System.out.println(factorial(inputBig));** prints correct factorial 
     **System.out.println(list.get(factorial(inputBig).intValue()));** prints null 
      numberOfInput--; 
     } 
    } 

    public static BigInteger factorial(BigInteger input){ 
    if(list.containsKey(input.intValue())) 
     return list.get(input.intValue()); 

    if(input.equals(new BigInteger("1"))) 
     return new BigInteger("1"); 
    BigInteger output; 
    output = input.multiply(factorial(input.subtract(new BigInteger("1")))); 
    list.put(input.intValue(), output); 
    return output; 
    } 

} 
+0

Пробовали ли вы отладки? Имеет ли код когда-либо доступ к 'list.put()'? Почему переменная 'Map' называется' list'? –

+0

Я не понимаю, что не работает. – jtomaszk

+0

@ Warthel4578 только что добавил два оператора Sysout в коде, с их выходом, пожалуйста, проверьте. – Kraken

ответ

2

Заменить

System.out.println(list.get(factorial(inputBig).intValue())); 

с

System.out.println(list.get(inputBig.intValue())); 

, потому что Вы вставляете значение для отображения здесь: list.put(input.intValue(), output);

+0

, даже если я сохраню его 'System.out.println (list.get (factorial (inputBig) .intValue()));', он не должен отличаться по результату, потому что внутри моей функции он проверяет, содержит ли карта уже ключ или нет, и если это произойдет, он вернет BigInt. – Kraken

+1

Это будет по-другому в результате, потому что ваша функция возвращает 'return map.get (input.intValue());' if map содержит ключ insted just. Return input.intValue() ' – jtomaszk

+0

Ohh Извините, мне плохо. Большое спасибо. – Kraken

0

Попробуйте

public static BigInteger factorial(BigInteger input) { 
    if (list.containsKey(input.intValue())) 
     return list.get(input.intValue()); 

    if (input.equals(BigInteger.ONE)) { 
     list.put(input.intValue(), BigInteger.ONE); 
     return BigInteger.ONE; 
    } 
    BigInteger output = input.multiply(factorial(input.subtract(BigInteger.ONE))); 
    list.put(input.intValue(), output); 
    return output; 
} 

И добавить печать после вашей numberOfInput в то время как петля ...

for (int key : list.keySet()) { 
    System.out.println(list.get(key)); 
} 

Кажется правильно выход

1 
10 
3628800 
1 
2 
6 
24 
120 
720 
5040 
40320 
362880 
3628800 
+0

Привет, я сделал изменение в факториале, и я думаю, что ваш цикл for предназначен только для целей отладки, поэтому я этого не делал. Теперь вот мой ввод, 5 (т. Е. Количество тестовых ящиков) -> 2 (вход) -> 2 (выход) 2 (выход) -> 3 (вход) -> 6 (выход) -> null Я дважды печатайте мой код, проверяйте изменения (для цели отладки). Можете ли вы проверить, получаете ли вы те же результаты? – Kraken

0

Я сделал тест , сначала упростите чтение данных, сосредоточьтесь на l ogic:

Я использую BigInteger.valueOf().

public class FCTRL2 { 

    public static void main(String[] args){ 

     InputStreamReader read = new InputStreamReader(System.in); 
     BufferedReader in = new BufferedReader(read); 
     Scanner scanner = new Scanner(in); 
     //simplify read data first ,here focus on calculation logic 
     while(scanner.hasNext()) { 
      long val = scanner.nextLong(); 
      BigInteger inputBig = BigInteger.valueOf(val); 
      System.out.println(factorial(inputBig)); 
     } 
     scanner.close(); 
    } 

    public static BigInteger factorial(BigInteger input){ 
    if(map.containsKey(input.intValue())) { 
     System.out.println("from map"); 
     return map.get(input.intValue()); 
    } 
    if(input.equals(new BigInteger("1"))) 
     return new BigInteger("1"); 
    BigInteger output; 
    output = input.multiply(factorial(input.subtract(new BigInteger("1")))); 
    map.put(input.intValue(), output); 
    System.out.println("from new calculating"); 
    return output; 
    } 
    private static Map<Integer,BigInteger> map = new HashMap<Integer,BigInteger>(); 
} 

увидеть результат и, кажется, карта кэшируются некоторые данные.

Это логика, что вы хотите?

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