设计一个计算⌊√n⌋的算法,n是任意正整数。除了赋值和比较运算,该算法只能用到基本的四则运算。
时间: 2024-02-09 08:12:46 浏览: 36
可以使用二分查找的思路来设计这个算法。具体来说,我们先初始化一个左边界 L=0,一个右边界 R=n。每次将中间值 mid=(L+R)/2 向下取整,然后判断 mid^2 是否小于等于 n。如果是,说明 mid 可以作为结果的候选值,我们将左边界 L 更新为 mid;如果不是,说明 mid 太大了,我们将右边界 R 更新为 mid-1。重复这个过程直到 L>R,此时 R 就是 ⌊√n⌋ 的值。
下面是该算法的 Python 代码实现:
```
def sqrt(n):
L, R = 0, n
while L <= R:
mid = (L + R) // 2
if mid * mid <= n:
ans = mid
L = mid + 1
else:
R = mid - 1
return ans
```
相关问题
用Java编写一个实验程序计算 L √ n 」,其中 n 是任意正整数,要求除了赋值和比较运算,该算法只能用到基本的四则运算,并输出1~20的求解结果。
可以使用二分查找的思路来设计这个算法。具体来说,我们先初始化一个左边界 L=0,一个右边界 R=n。每次将中间值 mid=(L+R)/2 向下取整,然后判断 mid 的 L 次方是否小于等于 n。如果是,说明 mid 可以作为结果的候选值,我们将左边界 L 更新为 mid;如果不是,说明 mid 太大了,我们将右边界 R 更新为 mid-1。重复这个过程直到 L>R,此时 R 就是 L √ n 的值。
下面是该算法的 Java 代码实现:
```java
public class Main {
public static void main(String[] args) {
for (int i = 1; i <= 20; i++) {
int ans = root(2, i);
System.out.println("2的" + i + "次方根为:" + ans);
}
}
private static int root(int L, int n) {
int R = n;
while (L <= R) {
int mid = (L + R) / 2;
long pow = 1;
for (int i = 1; i <= L; i++) {
pow *= mid;
if (pow > n) break;
}
if (pow <= n) {
L = mid + 1;
} else {
R = mid - 1;
}
}
return R;
}
}
```
输出结果:
```
2的1次方根为:1
2的2次方根为:1
2的3次方根为:1
2的4次方根为:2
2的5次方根为:2
2的6次方根为:2
2的7次方根为:2
2的8次方根为:2
2的9次方根为:3
2的10次方根为:3
2的11次方根为:3
2的12次方根为:3
2的13次方根为:3
2的14次方根为:3
2的15次方根为:3
2的16次方根为:4
2的17次方根为:4
2的18次方根为:4
2的19次方根为:4
2的20次方根为:4
```
设计一个函数MaxCommonFactor(),利用欧几里德算法(也称辗转相除法)计算两个正整数的最大公约数。假设有两个整数m和n,通过连续运用求余运算,直到余数为0为止,最后非0的余数就是最大公约数。请改正程序中的错误,使它能得出正确的结果。
好的,这是一个比较简单的问题。以下是一个可以工作的函数MaxCommonFactor(),它使用了欧几里德算法计算两个正整数的最大公约数:
```python
def MaxCommonFactor(m, n):
if m < n:
m, n = n, m
while n != 0:
m, n = n, m % n
return m
```
这个函数首先将两个整数比较,将较大的数赋值给m,较小的数赋值给n。然后,使用while循环,连续对m和n进行求余运算,直到余数为0为止。最后,非0的余数就是最大公约数。