首页 > 编程语言 >算法解析:二分查找实现整数平方根

算法解析:二分查找实现整数平方根

时间:2024-09-22 12:22:36浏览次数:18  
标签:二分 right int 整数 查找 平方根 root left

题目:

给你一个非负整数 x ,计算并返回 x 的算术平方根 。

由于返回类型是整数,结果只保留整数部分 ,小数部分将被舍去 。

注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。

示例 1:

输入:x = 4
输出:2

示例 2:

输入:x = 8
输出:2
解释:8 的算术平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。

 题目分析

这道题显然是在考察我们对循环结构的理解程度。

我们这里选择二分查找算法。

具体为:

建立3个变量:

  • left —— 最左值
  • right —— 最右值
  • root —— 测试值

循环方法:

  • root = left + (right - left) / 2
  • root < x ---> 改root为当前root到right的中间值  
  • root > x ---> 改root为当前root到left的中间值
  • 判断root与上一个root直接是否有整数,若没有,则直接返回 root - 1
  • root = x ---> 直接输出结果

代码实现

import java.util.Scanner;

//题目:不用库函数去寻找一个数算数平方根的整数解
//eg:9的算数平方根为3 ---------- 我们输出3
//	  8的算数平方根为2.828... --- 我们输出2

public class LoopTest {
	public static void main(String[] agrs) {
		int x = 0;
		int root = 0;
		
		//录入x
		System.out.println("请输入一个正整数:");
		Scanner sc = new Scanner(System.in);
		x = sc.nextInt();
		
		//调用求整数平方根class
		ExtractRoot find = new ExtractRoot();
		root = find.ExtractRootMethod(x);
		
		//输出结果
		System.out.println(x + "的去小数算数平方根为:" + root);
		
		sc.close();
	}
}

class ExtractRoot{
	public int ExtractRootMethod(int x) {
		
        //合法性判断
        if(x < 0>{
        	return -1;
        }
           
    	//特殊处理0和1
        if( x == 1 || x == 0){
            return x;
        }

		long root = 0;
		long left = 1;
		long right = x;
		
		while(left <= right) {
			//二分查找
			//1.如果小于x -> 改root为当前root到right的中间值 
			//2.如果大于x -> 改root为当前root到left的中间值。
            //若当前root与上一个root之间无整数,则直接返回上一个root
			//3.如果等于x -> 直接输出结果
			
			root = left + (right - left) / 2;
            
            //为了防止数值溢出,我们不使用常规的root * root == x
            //而使用root == x / root
			if(root < x / root) {
				left = root + 1;
			} else if (root > x / root) {
				if (root - 1 < x / (root - 1)) {
					//此时的root - 1 即为解
					return (int)(root - 1);
				} else {
					right = root - 1;
				}
			} else if (root == x / root) {
				return (int)root;
			}
		}
    //此行代码实际上可能没有机会执行,只是为了确保所有路径都有返回值
    //在大多数情况下,left 和 right 会收敛到同一个值.
    //但是如果它们不收敛,我们应该返回 left
    //因为它是最接近 x 的平方根的整数
	return (int)left;
	}
}

运行结果

算法解析:二分查找实现整数平方根_循环结构

算法解析:二分查找实现整数平方根_循环结构_02

标签:二分,right,int,整数,查找,平方根,root,left
From: https://blog.51cto.com/xuwenda/12079999

相关文章

  • 魔法城墙 查找星花的位置 scratch 20240921_143430
    魔法城墙定义一个变量它是内容它的值是21*34定义一个变量它是星花位置它的值是-1定义一个下标它的初始值是0目标遍历每一个字符首先需要把每一个字符的下标说出来有了下标我们就可以根据下标获取内容的对应字符说出每一个字符的下标我们有五个字符所以要重复五次......
  • C++ std::find函数 容器元素查找
    简介std::find函数是C++标准库内非常实用的一个函数,主要用于在给定范围内查找某个元素,如果找到该元素,则返回指向该元素的迭代器;如果没有找到,则返回指向范围末尾的迭代器(即 end() )。find函数原型std::find在头文件algorithm中template<classInputIt,classT>Inp......
  • 【oj刷题】二分查找篇:二分查找算法的原理和应用场景
    前言:二分查找算法,又称折半查找算法,是一种在有序数组中查找特定元素的高效查找方法。它通过将搜索区间不断缩小一半,从而在对数时间内找到目标元素。二分查找是基于分治策略的一种典型应用,能够高效的处理许多问题,下面我们就来看一下二分查找算法的原理和应用场景目录一、什......
  • 34. 在排序数组中查找元素的第一个和最后一个位置
    思路先判断target是否存在列表中,不存在直接输出存在,则找出第一个等于target值的列表位置,即目标值在列表中的开始位置接着在当前位置继续往下查找,找到最后一个目标值等于列表值的位置(也可用二分查找找到等于target值的位置+往前、往后找到开始、结束位置,但会超限,可参考(......