繁体   English   中英

用Java总结两个巨大的篇幅

[英]Sum two enormous long in Java

我写了这个方法,它在arrayList中搜索是否有两个总和等于变量elem的数字 问题在于变量的总和超过了long类型的维数。 我该怎么写?

public static boolean searchSum(ArrayList<Long> array, long elem) {
   int left = 0, right = array.size()-1;
   while (left<right) {
     long n1=Long.valueOf(array.get(left));
     long n2=Long.valueOf(array.get(right));
     if ((n1+n2)==elem) return true;
     else if ((n1+n2)<elem) left++;
     else right--;
   }
   return false;
 }

您可以使用java.math.BigInteger 它可以存储不可变的任意精度整数。

例如:

public BigInteger sum(Long number1, Long number2) {
    BigInteger bigNumber1 = BigInteger.valueOf(number1);
    BigInteger bigNumber2 = BigInteger.valueOf(number2);
    BigInteger result = bigNumber1.add(bigNumber2);
    return result;
}

在这种情况下,您可以这样重写此方法:

public static boolean searchSum(ArrayList<Long> array, long elem) {

    BigInteger bigElem = BigInteger.valueOf(elem);        
    int left = 0, right = array.size() - 1;

    while (left < right) {
        BigInteger n1 = BigInteger.valueOf(array.get(left));
        BigInteger n2 = BigInteger.valueOf(array.get(right));
        BigInteger sum = n1.add(n2);

        if (sum.equals(bigElem)) {
            return true;
        } else if (sum.compareTo(bigElem) < 0) {
            left++;
        } else {
            right--;
        }
    }
    return false;
}

我建议通过添加单个数字来编写它,如果它等于或大于长长度,则将其分成两个long或一个数组,并以这种方式访问​​数字以进行更长的数学运算。

您不需要BigInteger来告诉两个相似的有符号数字(此处为long s)溢出的总和。

  • 如果两个被告都有不同的符号:无溢出
  • 两个求和都为正:溢出iff和<任何(每个)求和
  • 两个被加数均为负:如果任何(每个)被加数<sum

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM