gpt4 book ai didi

java - 我需要 BigInteger 的可变版本,但无法访问 mutablebiginteger

转载 作者:行者123 更新时间:2023-12-01 19:52:49 26 4
gpt4 key购买 nike

我现在正在写一篇关于我编写的代码的文章。我正在计算超出变量 long 限制的值,并且我还需要比较这些值,因此我使用 BigInteger 代替。

事实是,BigInteger 是不可变的,因此每次发生新的计算时,我的程序运行速度越来越慢,因为新的 BigInteger 被添加到数组或其他内容中。

经过一些研究,我了解了 MutableBigInteger 并尝试使用它,但我无法导入此类,因为它是 java.util.Math 的私有(private)类。我发现一个主题,其中有人正在使用 MutableBigInteger Performance of MutableBigInteger

问题是,我无法理解他的大部分代码,因此我不知道如何使用 BigInteger 的可变版本。我也阅读了一些有关 BitSet 的内容,但我认为它在这种情况下对我没有帮助。

想象一个有 n 个数字 >0 的时钟。你需要把这个时钟“剪”成 2(想象一个有 15 个数字的时钟,我将在数字 1 上放置一个风险,在数字 7 上放置另一个风险)现在我需要检查 1 和 7 之间的数字之和是否为等于 7 和 1 之间的和(7 到 n 然后这个结果 'till cut 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
}

}

最佳答案

您需要了解如何使用 BigInteger 进行计算。

下面是两个计算的示例(假设 ijtam 是长数):

//(((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));

关于java - 我需要 BigInteger 的可变版本,但无法访问 mutablebiginteger,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50737384/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com