java 如何找到一个数的除数,最接近它的平方根?

bybem2ql  于 2023-01-15  发布在  Java
关注(0)|答案(3)|浏览(162)

我一直在试着编一个程序,它能给我一个数字n的除数,这个除数最接近它的平方根。
我试着用这个程序来完成这个任务:

public static int closestDivisor(int n) {
    for (int i = n/ 2; i >= 2; i--) {
        if (n % i == 0) {
            return i;
        }
    }
    return 1;
}

但是,当我运行这个:

System.out.println(closestDivisor(42));

当期望67时,我得到21,因为它们是42的最接近的约数。

plupiseo

plupiseo1#

if (i < 4) return 1;

int divisor = 1;
for (int i = 2; i < n; i++) {
    if (i * i == n) return i;
    if (i * i < n && n % i == 0) divisor = i;
    if (i * i > n) return divisor;
}

return -1; // never executed, unreachable

此代码应返回能整除n且小于或等于n平方根的最大数。
然后你可以看看这个数字,我们称之为answer和n/answer,其中一个肯定是最接近n平方根的n的因子。为了看哪个是哪个,我们可以比较n - answer*answer和(n/answer * n/answer)- n,看哪个更小;如果第一差值较小,则应答更接近N,否则N/应答更接近N。

guykilcj

guykilcj2#

这里有一个办法。

  • 首先,如果候选项为< 0 or 1 if < 4,则返回-1
  • 如果n是正平方,则返回平方根。

现在在循环内部,从square root开始,向外检查平方根的两边是否整除。

  • 默认除数初始化为-1
  • 在计算条件时,i除以ni通过divisor返回
  • 否则,k除以nk通过divisor返回。
public static int closestDivisor(int n) {
    if (n < 4) {
        return n < 0 ? -1 : 1;
    }
    int v = (int)Math.sqrt(n);
    int divisor = v;
    
    if (v * v == n) {
        return v;
    }
    for (int i = (int) v, k = i; i >= 1; i--, k++) {
        if ( n % (divisor = i) == 0
                || (n % (divisor = k) == 0)) {
            break;
        }
    }
    return divisor;
}
myzjeezk

myzjeezk3#

public static int closestDivisor(int n) {
    if(n==1)
        return 1;
    int divisor = n;
    while (divisor > 1) {
        int temp = n % divisor;
        n = divisor;
        divisor = temp;
    }
    return n == 1 ? 1 : n/divisor;
}

试试这个

相关问题