2016-03-25 3 views
0

整数を操作するためのJavaプログラムを作成しましたが、最大40桁ですが、コンパイル中にエラーが発生します。 お手伝いできますか?下に 私のコードを入れました。大きな整数のJavaプログラムを実行するときにエラーが発生する

public class HugeInteger { 

private int[] array = new int[40]; 

public HugeInteger() { 
    for (int i = 0; i <= 40; i++) { 
     array[i] = 0; 
    } 

} 

/** 
* 
* @param str 
*/ 
public HugeInteger(String str) { 

    if (str.length() > 41) { 
     System.out.printf("More than 40 digits"); 
    } 

    int i; 
    if (str.charAt(0) == '-') { 
     array[0] = -1; 
    } else if (str.charAt(0) != '0') { 
     array[0] = 1; 
    } 
    for (i = 0; i < 40; i++) { 
     if ((str.charAt(i) != '1') || (str.charAt(i) != '2') || (str.charAt(i) != '3') || (str.charAt(i) != '4') || (str.charAt(i) != '5') || (str.charAt(i) != '6') || (str.charAt(i) != '7') || (str.charAt(i) != '8') || (str.charAt(i) != '9') || (str.charAt(i) != '0')) { 
      System.out.printf("Not number"); 
      break; 
     } 

     char chr = str.charAt(i); 
     Integer dig = Integer.parseInt(String.valueOf(chr)); 
     array[i + 1] = dig; 

    } 
} 

/** 
* This method overrides the toString and it is used for printing the 
* object. 
* 
* @return string 
*/ 
@Override 
public String toString() { 
    String str = ""; 
    for (int i = 0; i < 40; i++) { 
     str = str.concat(String.valueOf(array[i])); 
    } 
    return str; 
} 

/** 
* This method adds two number together and returns their result. 
* 
* @param hg It's the second number to be added 
* @return result After adding two number result will be saved in result. 
* 
*/ 
public HugeInteger Sum(HugeInteger hg) { 
    HugeInteger result = new HugeInteger(); 
    int c = 0; 
    if (array[0] == 1 && hg.array[0] == 1) { 
     for (int i = 40; i >= 1; i--) { 
      result.array[i] = array[i] + hg.array[i] + c; 
      if (result.array[i] > 9) { 
       c = 1; 
       result.array[i] = result.array[i] % 10; 
      } else { 
       c = 0; 
      } 

     } 
     result.array[0] = 1; 
    } else if (array[0] == 1 && hg.array[0] == -1) { 
     hg.array[0] = 1; 
     result = Subtract(hg); 
    } else if (array[0] == -1 && hg.array[0] == 1) { 
     array[0] = 1; 
     result = Subtract(hg); 
     result.array[0] = (-1) * result.array[0]; 

    } else if (array[0] == -1 && hg.array[0] == -1) { 
     for (int i = 40; i >= 1; i--) { 
      result.array[i] = array[i] + hg.array[i] + c; 
      if (result.array[i] > 9) { 
       c = 1; 
       result.array[i] = result.array[i] % 10; 
      } else { 
       c = 0; 
      } 

     } 
     result.array[0] = -1; 

    } 

    return result; 
} 

/** 
* This method subtracts two number together and returns their result. 
* 
* @param hg It's the second number to be subtracted 
* @return result After subtracting two number result will be saved in 
* result. 
*/ 
public HugeInteger Subtract(HugeInteger hg) { 
    HugeInteger result = new HugeInteger(); 
    int c = 0; 
    if (array[0] == 1 && hg.array[0] == 1) { 
     if (array[1] > hg.array[1]) { 
      for (int i = 40; i >= 1; i--) { 
       if ((array[i] - c) < hg.array[i]) { 
        result.array[i] = (10 + array[i] - c) - hg.array[i]; 
        c = 1; 
       } else { 
        result.array[i] = (array[i] - c) - hg.array[i]; 
        c = 0; 
       } 
      } 
      for (int i = 0; i <= 40; i++) { 
       if (array[i] != 0) { 
        array[0] = 1; 
        break; 
       } 

      } 

     } else { 
      for (int i = 40; i >= 1; i--) { 
       if ((array[i] - c) < hg.array[i]) { 
        result.array[i] = (10 + hg.array[i] - c) - array[i]; 
        c = 1; 
       } else { 
        result.array[i] = (hg.array[i] - c) - array[i]; 
        c = 0; 
       } 
      } 
      result.array[0] = -1; 
     } 
    } 

    if (array[0] == 1 && hg.array[0] == -1) { 
     hg.array[0] = 1; 
     result = Sum(hg); 
    } 

    if (array[0] == -1 && hg.array[0] == 1) { 
     array[0] = 1; 
     result = Sum(hg); 
     result.array[0] = (-1) * result.array[0]; 
    } 

    if (array[0] == -1 && hg.array[0] == -1) { 
     if (array[1] > hg.array[1]) { 
      for (int i = 40; i >= 1; i--) { 
       if ((array[i] - c) < hg.array[i]) { 
        result.array[i] = (10 + array[i] - c) - hg.array[i]; 
        c = 1; 
       } else { 
        result.array[i] = (array[i] - c) - hg.array[i]; 
        c = 0; 
       } 
      } 
      for (int i = 0; i <= 40; i++) { 
       if (array[i] != 0) { 
        array[0] = 1; 
        break; 
       } 

      } 

     } else { 
      for (int i = 40; i >= 1; i--) { 
       if ((array[i] - c) < hg.array[i]) { 
        result.array[i] = (10 + hg.array[i] - c) - array[i]; 
        c = 1; 
       } else { 
        result.array[i] = (hg.array[i] - c) - array[i]; 
        c = 0; 
       } 
      } 
      result.array[0] = -1; 
     } 
     result.array[0] = (-1) * result.array[0]; 
    } 
    return result; 
} 

public int Sign(HugeInteger hg) { 
    return (hg.array[0]); 
} 

/** 
* This method checks whether the first number is equal to the second one or 
* not. 
* 
* @param hg It's the second number. 
* @return a boolean that reveals that this condition is true or false. 
*/ 
public boolean Equals(HugeInteger hg) { 
    boolean res = true; 
    for (int i = 0; i <= 40; i++) { 
     if (array[i] != hg.array[i]) { 
      res = false; 
      break; 
     } 
    } 
    return res; 
} 

/** 
* This method checks whether the first number is greater than the second 
* one or not. 
* 
* @param hg It's the second number. 
* @return a boolean that reveals that this condition is true or false. 
*/ 
public boolean isGreaterThan(HugeInteger hg) { 

    for (int i = 0; i <= 40; i++) { 
     if (array[i] > hg.array[i]) { 
      return true; 
     } else if (array[i] < hg.array[i]) { 
      return false; 
     } else { 
      i = i + 1; 
     } 
    } 
    return false; 
} 

/** 
* This method checks whether the first number is less than the second one 
* or not. 
* 
* @param hg It's the second number. 
* @return a boolean that reveals that this condition is true or false. 
*/ 
public boolean isLessThan(HugeInteger hg) { 
    for (int i = 0; i <= 40; i++) { 
     if (array[i] < hg.array[i]) { 
      return true; 
     } else if (array[i] > hg.array[i]) { 
      return false; 
     } else { 
      i = i + 1; 
     } 
    } 
    return false; 
} 

/** 
* This method checks whether the number is zero or not. 
* 
* @param hg It's the number. 
* @return a boolean that reveals that this condition is true or false. 
*/ 
public boolean isZero(HugeInteger hg) { 
    if (array[0] == 0) { 
     return true; 
    } 
    return false; 
} 

}

メインクラス:

public class Main { 

private static ArrayList<String> String; 

public static void main(String[] args) { 

    ArrayList<HugeInteger> num1 = new ArrayList<>(); 
    ArrayList<HugeInteger> num2 = new ArrayList<>(); 
    String line1, line2; 
    Scanner stdin = new Scanner(System.in); 
    line1 = stdin.nextLine(); 
    line2 = stdin.nextLine(); 
    System.out.printf("\n"); 
    System.out.printf("\n"); 
    HugeInteger a, b; 
    a = new HugeInteger(line1); 
    b = new HugeInteger(line2); 
    num1.add(a); 
    num2.add(b); 
    while (true) { 
     line1 = stdin.nextLine(); 
     if (line1.equals("exit")) { 
      break; 

     } 
     line2 = stdin.nextLine(); 
     System.out.printf("\n"); 
     a = new HugeInteger(line1); 
     b = new HugeInteger(line2); 
     num1.add(a); 
     num2.add(b); 

    } 
    int index = 0; 
    HugeInteger c, d; 

    while (index < num1.size()) { 
     c = num1.get(index); 
     d = num2.get(index); 
     System.out.printf("Sum: ", c.Sum(d)); 
     System.out.printf("Sub: ", c.Subtract(d)); 
     System.out.printf("Equals : ", c.Equals(d)); 
     System.out.printf("isGreaterThan: ", c.isGreaterThan(d)); 
     System.out.printf("isLessThan: ", c.isLessThan(d)); 
     index = index + 1; 
    } 

} 

}

+1

あなたはどんなエラーが表示されていますか? –

+0

独自のHugeIntegerクラスを作成しようとする試みが正しくありません[Integer.parseIntの使用は意味をなさない]。 JavaのBigIntegerを参照してください。 –

答えて

1

ちょうどあなたの質問を見ることで、あなたが持っているあなたのHugeIntegerクラスのStringを取っている2つのクラスを含む 40桁まで - あなたは

Integer dig = Integer.parseInt(String.valueOf(chr)); 

を使用しているため、JavaのIntegerクラスは2147483647の最大値を持っており、私はあなたが大きな数字にこれを扱うことができる新しいクラスを作るしようとしている見ることができますが、あなたのHugeIntegerクラスはまだ整数に依存しています2147483647、Integerクラスを使用して40桁の文字列を解析することは完全に失敗します。

あなたは多くのコードを投稿しましたが、本質的にあなたがしようとしていることは、私が言及した理由でうまくいかず、これにより、HugeIntegerに応じて、有効な回答。あなたはあなたのアプローチを再考したいでしょう