Мне нужна изменяемая версия BigInteger, но я не могу получить доступ к mutablebiginteger - PullRequest
0 голосов
/ 07 июня 2018

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

Дело в том, что BigInteger является неизменяемым, поэтому каждый раз, когда происходят новые вычисления, моя программа работает все медленнее и медленнее, потому что новый BigInteger добавляется в массив или что-то в этом роде.

После некоторого исследования яузнал о MutableBigInteger и попытался его использовать, но я не могу импортировать этот класс, потому что он закрыт от java.util.Math.Я нашел тему, где кто-то использовал MutableBigInteger Производительность MutableBigInteger

Проблема в том, что я не мог понять большую часть его кода, поэтому я не знаю, как использовать изменяемыйверсия BigInteger.Я также немного читал о BitSet, но не думаю, что это поможет мне в этом сценарии.

Представьте себе часы с n числами> 0.Вам нужно «разрезать» эти часы на 2 (представьте себе часы с 15 числами, я поставлю риск на число 1, а другое на число 7), теперь мне нужно проверить, являются ли суммы чисел от 1 до 7равный сумме от 7 до 1 (от 7 до n, затем этот результат до 1)

Вот мой код:

public class LinePuzzle {
private static int tam;
private static int cont = 0;
private static int t1parte, t2parte, t3parte, t4parte, ajuda, ajuda2;


static int geraCortes(int tam) {
    Thread tt1 = new Thread(t1);
    Thread tt2 = new Thread(t2);
    Thread tt3 = new Thread(t3);
    Thread tt4 = new Thread(t4);

    if(tam % 2 == 0){ 
        ajuda = tam/4;
        t1parte = ajuda;
        t2parte = ajuda*2;
        t3parte = ajuda*3;
        t4parte = ajuda*4;
    }else{ 
        ajuda2 = tam%4;
        ajuda = (tam-ajuda2)/4;
        t1parte = ajuda;
        t2parte = (ajuda*2);
        t3parte = (ajuda*3);
        t4parte = (ajuda*4) + ajuda2;
    }

     // "Starts"
    tt1.start();
    tt2.start();
    tt3.start();
    tt4.start();

    try {
        // 
        tt1.join();
        tt2.join();
        tt3.join();
        tt4.join();
    } catch (Exception ex) {
        System.out.println("Finalizado");
    }
    return cont;
}

private static Runnable t1 = new Runnable()  {
@Override
public void run() {
long soma1, soma2;
    for (int i = 0; i<= t1parte; i++) { // 1º cut
        for (int j = i + 1; j <= tam; j++) { // 2º cut
            if (i == j || i == j - 1) { // tests
                continue;
            }

            soma1 = (((i + 1) + (j - 1)) * (j - i - 1)) / 2; 
            soma2 = (((j + 1) + tam) * (tam - j) + (1 + (i - 1)) * (i - 1)) / 2;

            if (soma1 == soma2 && soma1 != 0) {
                BigInteger bi, bi2; 

                bi = BigInteger.valueOf(soma1);
                bi2 = BigInteger.valueOf(soma2);

                if(bi.equals(bi2)){
                System.out.printf("Equals: cut1 = %d and cut2 = %d -> result: %s / %s\n", i, j, bi, bi2);
                    cont++; 
                    break;
                }
            }
        }
    }
}
};
private static Runnable t2 = new Runnable() {
@Override
public void run() {
long soma1, soma2;
    for (int i = t1parte; i<= t2parte; i++) { 
        for (int j = i + 1; j <= tam; j++) { 
            if (i == j || i == j - 1) {
                continue;
            }

            soma1 = (((i + 1) + (j - 1)) * (j - i - 1)) / 2;
            soma2 = (((j + 1) + tam) * (tam - j) + (1 + (i - 1)) * (i - 1)) / 2;

            if (soma1 == soma2 && soma1 != 0) {
               BigInteger bi, bi2; 

                bi = BigInteger.valueOf(soma1);
                bi2 = BigInteger.valueOf(soma2);

                if(bi.equals(bi2)){
                System.out.printf("Equals: cut1 = %d and cut2 = %d -> result: %s / %s\n", i, j, bi, bi2);
                    cont++; 
                    break;
                }
            }
        }
    }
}
};

private static Runnable t3 = new Runnable() {
@Override
public void run() {
long soma1, soma2;
    for (int i = t2parte; i<= t3parte; i++) { // 1º corte
        for (int j = i + 1; j <= tam; j++) { // 2º corte
            if (i == j || i == j - 1) {
                continue;
            }

            soma1 = (((i + 1) + (j - 1)) * (j - i - 1)) / 2;
            soma2 = (((j + 1) + tam) * (tam - j) + (1 + (i - 1)) * (i - 1)) / 2;

            if (soma1 == soma2 && soma1 != 0) {
                BigInteger bi, bi2; 

                bi = BigInteger.valueOf(soma1);
                bi2 = BigInteger.valueOf(soma2);
                if(bi.equals(bi2)){
                System.out.printf("Equals: cut1 = %d and cut2 = %d -> result: %s / %s\n", i, j, bi, bi2);
                    cont++; 
                    break;
                }
            }
        }
    } 
}
};

private static Runnable t4 = new Runnable() {
@Override
public void run() {
long soma1, soma2;
    for (int i = t3parte; i<= t4parte; i++) { // 1º corte
        for (int j = i + 1; j <= tam; j++) { // 2º corte
            if (i == j || i == j - 1) {
                continue;
            }

            soma1 = (((i + 1) + (j - 1)) * (j - i - 1)) / 2;
            soma2 = (((j + 1) + tam) * (tam - j) + (1 + (i - 1)) * (i - 1)) / 2;

            if (soma1 == soma2 && soma1 != 0) {
                BigInteger bi, bi2; 

                bi = BigInteger.valueOf(soma1);
                bi2 = BigInteger.valueOf(soma2);
                if(bi.equals(bi2)){
                System.out.printf("Equals: cut1 = %d and cut2 = %d -> result: %s / %s\n", i, j, bi, bi2);
                    cont++; 
                    break;
                }
            }
        }
    }
}
};   

public static void main(String[] args) {
    Scanner scan = new Scanner(System.in);

    do{
        System.out.println("Clock length: ");
        tam = scan.nextInt();
    }while(tam < 2);

    System.out.println("Numbers of equals: " + geraCortes(tam)); // executar o geracortes e os threads
}

}

1 Ответ

0 голосов
/ 07 июня 2018

Вам необходимо понять, как использовать BigInteger для выполнения расчетов.

Ниже приведены примеры с двумя вашими расчетами (при условии, что i, j, tam - длинные):

//(((i + 1) + (j - 1)) * (j - i - 1)) / 2; 
BigInteger bSoma1 = bigI.add(BigInteger.ONE)
        .add(bigJ.subtract(BigInteger.ONE))
        .multiply(bigJ.subtract(bigI).subtract(BigInteger.ONE))
        .divide(BigInteger.valueOf(2));

//(((j + 1) + tam) * (tam - j) + (1 + (i - 1)) * (i - 1)) / 2;
BigInteger bSoma2 = bigJ.add(BigInteger.ONE).add(bigTam)
        .multiply(bigTam.subtract(bigJ))
        .add(BigInteger.ONE.add(bigI.subtract(BigInteger.ONE)))
        .multiply(bigI.subtract(BigInteger.ONE))
        .divide(BigInteger.valueOf(2));
...