2013-11-14 3 views
0

Мне нужно создать класс 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()); 

}

И если я кладу в большом количестве, я получаю исключение: enter image description here

Проблема может начать с метода subAbs.

+1

Попробуйте ['StringBuilder'] (http://docs.oracle.com/javase/7/docs/api/java/lang/StringBuilder.html) вместо' String'. –

+0

@ PM77-1 спасибо, я только что прочитал о StringBuilder и попробую его сейчас. –

+1

Вам по-прежнему нужен более эффективный [алгоритм умножения] (http://www.freepatentsonline.com/6633896-0-large.jpg). –

ответ

1

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

Как бы Вы могли умножать 100x12345 вручную? Вы бы добавили 12345 + 12345, затем возьмите это и добавьте 12345, затем возьмите это и добавьте 12345 и повторите 100 раз? Это то, что сейчас делает ваш alogirthm. Вы должны попытаться реализовать свой алгоритм умножения так же, как и умножить 100x12345.

+0

Спасибо за ваш очень скоро и полезный ответ. Кажется, я понимаю, что ты сказал. Что мне нужно сделать, так это то, что вместо того, чтобы использовать дополнение medto 100 раз, я должен добавить только 2 цифры «0» в конце строки. И это сделает мою программу более быстрой., Правильно? –

+2

Это ... не общий способ сделать это. Лучше: как бы вы умножали 123 x 12345 вручную? Внедрите алгоритм _that_. –

+2

Помните, когда вы узнали умножение больших чисел в школе? Вы можете обновить свою память, посмотрев следующую картинку: http://www.freepatentsonline.com/6633896-0-large.jpg –

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