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

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

时间:2024-09-22 12:22:36浏览次数:10  
标签:二分 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++高精度求平方根(保留整数)
    #include<iostream>#include<cstring>usingnamespacestd;constintSIZE=200;structhugeint{ intlen,num[SIZE];};hugeinttimes(hugeinta,hugeintb){ inti,j; hugeintans; memset(ans.num,0,sizeof(ans.num)); for(i=1;i<=......
  • 二分图
    定义节点由两个集合组成,且两个集合内部没有边的图性质无奇环每条边都是从一个集合走向另一个集合。二分图判定使用染色法。进行\(dfs\),为图进行黑白染色,若可以完成则该图是二分图。boolvis[N];//0:未染色,1:黑色,2:白色boolflag=1;voiddfs(intx){ for(autoy:v[......
  • 算法随笔——wqs二分
    学习链接学习链接应用条件选择恰好\(x\)个物品,求最优值设\(x\)对应最优值\(f_x\),\((x,f_x)\)在图像上呈现为凸包。无数量限制问题简单可做问题转化有\(n\)个物品,恰好选\(m\)个,计算最优值。做法例题模版题:P2619......
  • 快速查找EXCEL整个工作表中的合并单元格
    1.按下`Alt+F11`,打开VBA编辑器。2.在左侧的“项目”窗口中,找到你的工作簿,右键点击该工作簿下的任意工作表,选择**插入->模块**。3.在新建的模块窗口中,粘贴以下代码:SubHighlightMergedCells()DimcellAsRangeDimwsAsWorksheetSetws=ActiveSheet......
  • C++ std::find函数 容器元素查找
    简介std::find函数是C++标准库内非常实用的一个函数,主要用于在给定范围内查找某个元素,如果找到该元素,则返回指向该元素的迭代器;如果没有找到,则返回指向范围末尾的迭代器(即 end() )。find函数原型std::find在头文件algorithm中template<classInputIt,classT>Inp......
  • 【oj刷题】二分查找篇:二分查找算法的原理和应用场景
    前言:二分查找算法,又称折半查找算法,是一种在有序数组中查找特定元素的高效查找方法。它通过将搜索区间不断缩小一半,从而在对数时间内找到目标元素。二分查找是基于分治策略的一种典型应用,能够高效的处理许多问题,下面我们就来看一下二分查找算法的原理和应用场景目录一、什......
  • 简单C#递归(向前查找上工序)
    ///<summary>///递归查找前工序,直到找到没有跳序的前工序///</summary>///<paramname="process"></param>///<returns></returns>privateasyncTask<List<string>>HasReportedWorkAsync(List<WorkOrderProcedureEnti......
  • 34. 在排序数组中查找元素的第一个和最后一个位置
    思路先判断target是否存在列表中,不存在直接输出存在,则找出第一个等于target值的列表位置,即目标值在列表中的开始位置接着在当前位置继续往下查找,找到最后一个目标值等于列表值的位置(也可用二分查找找到等于target值的位置+往前、往后找到开始、结束位置,但会超限,可参考(......
  • 算法设计与分析(二分查找算法
    目录二分查找算法详解引言算法步骤代码实现注意事项结论小结:二分查找算法详解引言二分查找算法是一种在有序数组中查找特定元素的搜索算法。它通过不断将数组分成两半,缩小搜索范围,从而快速定位到目标元素的位置。二分查找算法的时间复杂度为O(logn),其中n是数组的长度。算法步骤......