Java中两个大整数的关系运算
在尝试使用二进制搜索方法计算biginger的平方根时,我被困在如何匹配两个biginger以满足比较操作的问题之间。 比如,我想检查两个大整数变量之间的相等,大于或小于条件 下面是一段错误的代码,我大致了解了我想要执行的操作。如能尽力解决此问题,我们将不胜感激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
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
sComparable
调用compareTo
,该方法由Comparable
定义。必须定义compareTo
方法,因为BigInteger
声明它实现了Comparable。虽然欢迎您回答自己的问题,但我不知道重复会得到什么。但这不是m