Мне нужно создать класс MyBigInteger для вычисления операций: mod inverse и mod power с> очень большими целыми числами (около 60 цифр в Decimals или больше). Чтобы решить эту проблему, я использую String для хранения моих> чисел и создания некоторых базовых функций, таких как добавление, вычитание, мода, div, ... Но проблема, которую я получил, - это то, что: в то время как мои методы добавления и вычитания работают правильно, несколько функций работают только с небольшими числами, и если я использую ввод с цифрами 7, 8 или более цифр, моя программа не будет отвечать. Я думаю, что моя идея использовать String для хранения больших чисел может быть плохой идеей, и если я использую массив для их хранения,> будет ли мой класс работать быстрее, не так ли? Ниже мой код. Метод добавления и вычитания работает корректно, поэтому я выведу только метод> multiple. Во-первых, метод MyBigInteger умножает целое число. Я использую его, чтобы создать свой Multipler между двумя> MyBigInteger:Создайте свой собственный BigInteger с помощью String в Java
public class MyBigInteger {
private String val;
public static final MyBigInteger ZERO = new MyBigInteger("0");
...
private MyBigInteger mutiple(int k){
MyBigInteger result = ZERO;
if(k == 0) return result;
for(int i = 1; i <= Math.abs(k); i++) result = result.add(this);
if(k > 0) return result;
else return result.getOpposite(); // result.add(result.getOpposite()) == ZERO
}
public MyBigInteger mutiple(MyBigInteger mbi){
MyBigInteger result = ZERO;
if(mbi.toString().charAt(0) != '-'){
for(int i = mbi.toString().length() - 1; i >= 0; i--){
result = result.add(this.mutiple(Integer.parseInt(mbi.toString().charAt(mbi.toString().length() - i -1) + "")).mutiple((int)Math.pow(10, i)));
}
} else{
for(int i = mbi.toString().length() - 1 ; i >= 1; i--){
result = result.add(this.mutiple(Integer.parseInt(mbi.toString().charAt(mbi.toString().length() - i) + "")).mutiple((int)Math.pow(10, i-1)));
}
result = result.getOpposite();
}
return result;
}
Большое спасибо за любую помощь, вы можете быть в состоянии обеспечить
Извините за это, но метод Умножение был зафиксирован и он отлично работает. Но это не единственная проблема в моем классе. Я создал метод mod, используя метод вычитания. И в моем методе вычитания я использую метод subAbs, который является особым вычитанием для двух Positive MyBigNumber.
public MyBigInteger subAbs(MyBigInteger mBI){
String result = "";
int i = this.getLength();
int j = mBI.getLength();
int s = 0;
int r = 0;
String temp = "";
String val1 = this.toString();
String val2 = mBI.toString();
if(this.equalsTo(mBI) == true) return ZERO;
else
if(this.greaterThan(mBI) == true){
for(int k = 0; k < i - j; k++) temp += "0";
val2 = temp + val2;
for(int k = i-1; k > 0; k--){
//And the statement right behind this comment is the wrong line (224) in the image
s = 10 + Integer.parseInt(val1.charAt(k) + "") - Integer.parseInt(val2.charAt(k) + "") - r;
if(s >= 10){
s = s - 10;
r = 0;
} else r = 1;
result = Integer.valueOf(s).toString() + result;
}
s = Integer.parseInt(val1.charAt(0) + "") - Integer.parseInt(val2.charAt(0)+"") - r;
if(s >= 0) result = s + result;
else result = Integer.valueOf(s).toString() + result;
return new MyBigInteger(result);
} else return new MyBigInteger("-" + mBI.subAbs(this).toString());
}
И если я кладу в большом количестве, я получаю исключение:
Проблема может начать с метода subAbs.
Попробуйте ['StringBuilder'] (http://docs.oracle.com/javase/7/docs/api/java/lang/StringBuilder.html) вместо' String'. –
@ PM77-1 спасибо, я только что прочитал о StringBuilder и попробую его сейчас. –
Вам по-прежнему нужен более эффективный [алгоритм умножения] (http://www.freepatentsonline.com/6633896-0-large.jpg). –