Java 检查数字是否为正方
下面计算完美平方的算法是如何工作的。我正在尝试使用这段逻辑来计算平方根。但我不明白它是如何计算平方根的。有没有算法可以完成这段代码中编写的逻辑Java 检查数字是否为正方,java,algorithm,square-root,Java,Algorithm,Square Root,下面计算完美平方的算法是如何工作的。我正在尝试使用这段逻辑来计算平方根。但我不明白它是如何计算平方根的。有没有算法可以完成这段代码中编写的逻辑 public static boolean isPerfectSquare(BigDecimal num) { BigDecimal squareRoot = one; BigDecimal square = one; BigDecimal i = one;
public static boolean isPerfectSquare(BigDecimal num) {
BigDecimal squareRoot = one;
BigDecimal square = one;
BigDecimal i = one;
BigDecimal newSquareRoot;
int comparison = -1;
while (comparison != 0) {
if (comparison < 0) {
i = i.multiply(two);
newSquareRoot = squareRoot.add(i).setScale(0, RoundingMode.HALF_UP);
} else {
i = i.divide(two);
newSquareRoot = squareRoot.subtract(i).setScale(0, RoundingMode.HALF_UP);
}
if (newSquareRoot.compareTo(squareRoot) == 0) {
return false;
}
squareRoot = newSquareRoot;
square = squareRoot.multiply(squareRoot);
comparison = square.compareTo(num);
}
return true;
}
公共静态布尔isPerfectSquare(BigDecimal num){
BigDecimal平方根=一;
大十进制平方=1;
大十进制i=一;
双十进制newSquareRoot;
int比较=-1;
while(比较!=0){
如果(比较<0){
i=i.乘(二);
newSquareRoot=平方根.add(i).setScale(0,舍入模式.半向上);
}否则{
i=i.除以(二);
newSquareRoot=平方根。减法(i)。设置刻度(0,取整模式。向上减半);
}
if(newSquareRoot.compareTo(平方根)==0){
返回false;
}
平方根=新平方根;
平方=平方根。乘(平方根);
比较=平方。比较到(num);
}
返回true;
}
我建议您添加一些System.out.println()
调用,以观察进展情况
下面是我在101上执行相同操作并运行后收到的输出。它只是简单地增加猜测,直到它太高,然后改进猜测,直到它找到一个精确的匹配或确定它不能
它的细化过程是逐步减少,直到过低。然后它又跳了起来(步幅加倍),然后又开始往下走。如果它到达一个点,其步长值小于1,那么它会放弃,因为参数不是一个完美的正方形。如果在任何步骤中,猜测的平方与参数匹配,那么您已经找到了平方根,因此您知道参数是一个完美的平方
1 is lower than 101: adding 2. New guess at square root is 3 ( 9)
9 is lower than 101: adding 4. New guess at square root is 7 ( 49)
49 is lower than 101: adding 8. New guess at square root is 15 (225)
225 is higher than 101: subbing 4. New guess at square root is 11 (121)
121 is higher than 101: subbing 2. New guess at square root is 9 ( 81)
81 is lower than 101: adding 4. New guess at square root is 13 (169)
169 is higher than 101: subbing 2. New guess at square root is 11 (121)
121 is higher than 101: subbing 1. New guess at square root is 10 (100)
100 is lower than 101: adding 2. New guess at square root is 12 (144)
144 is higher than 101: subbing 1. New guess at square root is 11 (121)
121 is higher than 101: subbing 0.5. New guess at square root is 11 (121)
101 is not a perfect square
你能分享整个代码吗?我找不到变量“2”。所有提到的变量,如1、2等,都是一些全局变量,初始化为相应的numberIt,可能是牛顿-拉斐逊算法。但是无论你从哪里得到它,你都应该记录下所使用的算法。在我看来,它不像牛顿·拉弗森。@poseidon_rishi你正在寻找的算法,它做的事情是相同的[因为如果(i^2==squarRoot)为真,那么我从1到无穷大做;如果(i^2>squarRoot)为假;]但是你贴的是Faster,我们该怎么说这种算法和问题解决。无论如何,谢谢你的回答。从2-3天以来一直被逻辑所困扰。