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天以来一直被逻辑所困扰。