2016-11-04 3 views
-1

大きな数値が関係しているので、Java BigIntegerで使用できるクラスがありますが、使用できない制約がありますこれと私はライブラリを使わずに分割をしなければならない。利用可能なデータ型のサイズより大きい数値で整数除算を実行しようとしています

これは私がこれまで試みたが、メモリリークの問題を持って、私は特定のエラーケースを通過した後、このメソッド内getDivisionResultを呼んでいるいずれかの答え

private Integer getDivisionResult(ArrayList<Integer> first, ArrayList<Integer> second) { 
    int firstLength = first.size(); 
    int secondLength = second.size(); 
    int counter = 0; 
    if (firstLength < secondLength) { 
     return counter; 
    } 
    do { 
     int carry = 0, cursor1 = firstLength - 1, cursor2 = secondLength - 1; 
     for (int i = firstLength - 1; i >= 0; i--, cursor1--, secondLength--) { 
      int value = 0, from = 0; 
      from = first.get(cursor1) - carry; 
      if (from < (cursor2 < 0 ? 0 : second.get(cursor2))) { 
       if (cursor1 > 0) { 
        from = 10 + from; 
       } 
       carry = 1; 
      } else { 
       carry = 0; 
      } 
      value = from - (cursor2 < 0 ? 0 : second.get(cursor2)); 
      first.set(i, value); 
     } 
     counter++; 
    }while (isLesserThan(second,first)); 
    return counter; 
} 


private boolean isLesserThan(ArrayList<Integer> list, ArrayList<Integer> firstList) { 
    boolean result = true; 
    if (list.size() < firstList.size()) { 
     return true; 
    } 
    for (int i = 0; i < list.size(); i++) { 
     if (firstList.get(i) > list.get(i)) { 
      result = true; 
      break; 
     } else if (firstList.get(i) == list.get(i)) { 
      continue; 
     } else { 
      result = false; 
      break; 
     } 
    } 
    return result; 
} 

を取得していないものです:

/** 
* @param numOne 
* @param numTwo 
* @return sign : true (negative) , false (positive) 
*/ 
public Result getResult(String numOne, String numTwo) { 
    Result result = new Result(); 
    int res = 0; 
    boolean sign = false; 
    ArrayList<Integer> firstNum; 
    ArrayList<Integer> secondNum; 
    if (isNegative(numOne)) { 
     firstNum = getArray(numOne.substring(1)); 
     if (isNegative(numTwo)) { 
      sign = false; 
      secondNum = getArray(numTwo.substring(1)); 
     } else { 
      secondNum = getArray(numTwo); 
      sign = true; 
     } 
    } else { 
     firstNum = getArray(numOne); 
     if (isNegative(numTwo)) { 
      sign = true; 
      secondNum = getArray(numTwo.substring(1)); 
     } else { 
      secondNum = getArray(numTwo); 
     } 
    } 
    if (isNull(secondNum)) { 
     result.setSign("Division by 0 is not permissable"); 
     result.setValue(res); 
     return result; 
    } else { 
     if (isNull(firstNum)) { 
      result.setSign(""); 
      result.setValue(res); 
      return result; 
     } 
     firstNum = getNumberWithoutZeroes(firstNum); 
     secondNum = getNumberWithoutZeroes(secondNum); 
     res = getDivisionResult(firstNum, secondNum); 
     if (sign) { 
      result.setSign("-"); 
     } else { 
      result.setSign(""); 
     } 
     result.setValue(res); 
    } 
    return result; 
} 

private ArrayList<Integer> getNumberWithoutZeroes(ArrayList<Integer> num) { 
    ArrayList<Integer> list = new ArrayList<>(); 
    for (Integer x : num) { 
     if (x == 0) { 
      continue; 
     } else { 
      list.add(x); 
     } 
    } 
    return list; 
} 

private boolean isNegative(String num) { 
    boolean result = false; 
    if (num.startsWith("-")) { 
     result = true; 
    } 
    return result; 
} 

private boolean isNull(ArrayList<Integer> num) { 
    boolean result = true; 
    for (Integer x : num) { 
     if (x > 0) { 
      result = false; 
     } 
    } 
    return result; 
} 

private ArrayList<Integer> getArray(String num) { 
    ArrayList<Integer> list = new ArrayList<>(); 
    char[] arr = num.toCharArray(); 
    for (int i = 0; i < num.length(); i++) { 
     list.add(Integer.valueOf(arr[i])); 
    } 
    return list; 
} 

誰かが私の問題に対してより良い解決策を提供するのを助けることができれば、私は感謝するでしょう

+1

"私には制約があります..."これは学校のための特別なチャレンジプロジェクトでなければならず、本質的には不正行為をしようとしています。 JDKに既に組み込まれている完璧なソリューションを使用させない理由が他にありません – ControlAltDel

+0

この質問は、クラスをプログラミングする際のチャレンジであることがほぼ確実であるため、すでにJavaで – ControlAltDel

+0

私が知りたいのは、より良い解決策が存在するかどうかだけです。あなたが好きなものは何でもやります。 –

答えて

0

私は自分自身の問題を解決しましたが、今問題はそれですsの処理速度。

関連する問題