Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中两个大整数的关系运算_Java_Biginteger_Binary Search_Comparison Operators - Fatal编程技术网

Java中两个大整数的关系运算

Java中两个大整数的关系运算,java,biginteger,binary-search,comparison-operators,Java,Biginteger,Binary Search,Comparison Operators,在尝试使用二进制搜索方法计算biginger的平方根时,我被困在如何匹配两个biginger以满足比较操作的问题之间。 比如,我想检查两个大整数变量之间的相等,大于或小于条件 下面是一段错误的代码,我大致了解了我想要执行的操作。如能尽力解决此问题,我们将不胜感激 public static BigInteger squareroot(BigInteger bi){ //BigInteger bkl; BigInteger low,high,mid; low=ONE; high=b

在尝试使用二进制搜索方法计算biginger平方根时,我被困在如何匹配两个biginger以满足比较操作的问题之间。 比如,我想检查两个大整数变量之间的相等大于或小于条件

下面是一段错误的代码
,我大致了解了我想要执行的操作。如能尽力解决此问题,我们将不胜感激

public static BigInteger squareroot(BigInteger bi){
    //BigInteger bkl;
    BigInteger low,high,mid;
low=ONE;
high=bi.add(ZERO);
while(low<=high)
{
    mid =(low.add(high)).divide(new BigInteger("2"));
    if(mid.multiply(mid).equals(bi))
        return mid;
    if(mid.multiply(mid) > bi)
        high = mid -1 ;
    else
        low = mid + 1;
}
return mid;
}
公共静态BigInteger平方根(BigInteger bi){
//大整数bkl;
大整数低、高、中;
低=1;
高=双加(零);
while(低bi)
高=中-1;
其他的
低=中+1;
}
中途返回;
}

biginger
s是
对象
s,因此您无法将其内容与关系运算符(如
)进行比较,
=
不会比较内容;它将比较对象引用

但是,
biginger
确实实现了
compariable
,因此调用

  • 要实现相等,请使用
    left.compareTo(right)==0
  • 对于小于,请使用
    左。与(右)<0
    比较
  • 对于大于,请使用
    左。比较到(右)>0

biginger
s是
对象
s,因此您无法将其内容与关系运算符(如
)进行比较,
=
不会比较内容;它将比较对象引用

但是,
biginger
确实实现了
compariable
,因此调用

  • 要实现相等,请使用
    left.compareTo(right)==0
  • 对于小于,请使用
    左。与(右)<0
    比较
  • 对于大于,请使用
    左。比较到(右)>0

您没有正确使用
biginger
类:

  • 您可以用一个简单的
    high=bi
    替换
    high=bi。添加(零)
  • 对于
    biginger
    操作数,将不会编译比较
    low bi
  • 算术运算
    mid-1
    mid+1
    不会针对
    BigInteger
    操作数编译
  • 使用
    除法(新的BigInteger(“2”))
    不是很有效;改用
    shiftRight(1)
  • 试试这个方法:

    public static BigInteger squareroot(BigInteger bi)
    {
        BigInteger low  = BigInteger.ZERO;
        BigInteger high = bi;
        while (true)
        {
            BigInteger mid0 = low.add(high).shiftRight(1);
            BigInteger mid1 = mid0.add(BigInteger.ONE);
            BigInteger square0 = mid0.multiply(mid0);
            BigInteger square1 = mid1.multiply(mid1);
            if (square0.compareTo(bi) > 0)
                high = mid0;
            else if (square1.compareTo(bi) <= 0)
                low = mid1;
            else
                return mid0;
        }
    }
    
    公共静态BigInteger平方根(BigInteger bi)
    {
    BigInteger低=BigInteger.0;
    BigInteger高=bi;
    while(true)
    {
    BigInteger mid0=低。加(高)。移位触发器(1);
    biginger mid1=mid0.add(biginger.ONE);
    BigInteger square0=mid0.乘法(mid0);
    BigInteger square1=mid1.乘法(mid1);
    如果(平方0.与(bi)>0相比)
    高=中0;
    
    否则,如果(square1.compareTo(bi)未正确使用
    biginger
    类:

  • 您可以用一个简单的
    high=bi
    替换
    high=bi。添加(零)
  • 对于
    biginger
    操作数,将不会编译比较
    low bi
  • 算术运算
    mid-1
    mid+1
    不会针对
    BigInteger
    操作数编译
  • 使用
    divide(新的BigInteger(“2”))
    效率不高;请改用
    shiftRight(1)
  • 试试这个方法:

    public static BigInteger squareroot(BigInteger bi)
    {
        BigInteger low  = BigInteger.ZERO;
        BigInteger high = bi;
        while (true)
        {
            BigInteger mid0 = low.add(high).shiftRight(1);
            BigInteger mid1 = mid0.add(BigInteger.ONE);
            BigInteger square0 = mid0.multiply(mid0);
            BigInteger square1 = mid1.multiply(mid1);
            if (square0.compareTo(bi) > 0)
                high = mid0;
            else if (square1.compareTo(bi) <= 0)
                low = mid1;
            else
                return mid0;
        }
    }
    
    公共静态BigInteger平方根(BigInteger bi)
    {
    BigInteger低=BigInteger.0;
    BigInteger高=bi;
    while(true)
    {
    BigInteger mid0=低。加(高)。移位触发器(1);
    biginger mid1=mid0.add(biginger.ONE);
    BigInteger square0=mid0.乘法(mid0);
    BigInteger square1=mid1.乘法(mid1);
    如果(平方0.与(bi)>0相比)
    高=中0;
    
    else if(square1.compareTo(bi)二进制搜索平方根?如何工作?@ElliottFrisch它执行二进制搜索,高为平方,低为0,当二进制搜索找到整数即平方根时返回。@Human我没有看到数组(连续或其他)在OP的帖子中。另外,如果我传入
    10
    @ElliottFrisch,我说的不对,它从高的数字是平方+1开始,低的是0。它收敛于平方根,就像二进制搜索在数组中搜索整数时一样。你可以粗略估计得到10的平方根是3y何时运行这段代码。对平方根进行二进制搜索?如何工作?@ElliottFrisch它执行二进制搜索,高为平方,低为0,当二进制搜索找到整数即平方根时返回。@Human我没有看到数组(连续或其他)在OP的帖子中。另外,如果我传入
    10
    @ElliottFrisch,我说的不对,它从高的数字是平方+1开始,低的是0。它收敛于平方根,就像二进制搜索在数组中搜索整数时一样。你可以粗略估计得到10的平方根是3y何时运行这段代码。但这不是我的问题。执行此操作后,我将收到什么???我想比较两个大整数的大于或小于关系。我将如何使用此可比较接口来帮助我实现这一点?调用
    compareTo
    肯定会帮到你。你将能够比较val通过调用
    compareTo
    ,使用两个
    BigInteger
    s
    Comparable
    调用
    compareTo
    ,该方法由
    Comparable
    定义。必须定义
    compareTo
    方法,因为
    BigInteger
    声明它实现了Comparable。虽然欢迎您回答自己的问题,但我不知道重复会得到什么。但这不是m