求一个任意实数的算术平方根的算法设计_LeetCode基础算法题第112篇: 设计一个恰当的矩形页面...

252a24b360ff74d4c0317aff214f4b4c.png

技术提高是一个循序渐进的过程,所以我讲的leetcode算法题从最简单的level开始写的,然后到中级难度,最后到hard难度全部完。

目前我选择C语言,Python和Java作为实现语言,因为这三种语言还是比较典型的。由于篇幅和精力有限,其他语言的实现有兴趣的朋友请自己尝试。

初级难度说的差不多的时候,我打算再加点其他内容,我可能会从操作系统到协议栈,从分布式聊到大数据框架,从大数据聊到人工智能,... ...。

如果有任何问题可以在文章后评论或者私信给我

我会持续分享下去,敬请您的关注。

LeetCode 492. 构造矩形(Construct the Rectangle)

问题描述:

作为一位web开发者, 懂得怎样去规划一个页面的尺寸是很重要的。 现给定一个具体的矩形页面面积,你的任务是设计一个长度为 L 和宽度为 W 且满足以下要求的矩形的页面。要求:

  1. 你设计的矩形页面必须等于给定的目标面积。
  2. 宽度 W 不应大于长度 L,换言之,要求 L >= W 。
  3. 长度 L 和宽度 W 之间的差距应当尽可能小。

你需要按顺序输出你设计的页面的长度 L 和宽度 W。

注:

  1. 给定的面积不大于 10,000,000 且为正整数。
  2. 你设计的页面的长度和宽度必须都是正整数。

示例:

c0876502984736316529eab2f2ccba47.png

C语言实现:

这道题的最核心问题是长度和宽度的差要最小。那么,什么时候它们的差最小?显然有:

  1. 如果长是area宽是1的时候,这个时候差是最大的;
  2. 如果area的算术平方根恰好是整数,那么这时候它们的差是0;
  3. 如果area的算术平方根不是整数,那么距离area算术平方根最近的一对长宽值,一定是差最小的一对。

基于这个原理,我们知道要先求出area的平方根,库中有现成的函数可以直接拿来用,不建议自己实现。

最终代码如下:

deeb736c5b5f7608f5740898cf8265f3.png

我们求得了area的算术平方根后,这个值是一个双精度浮点数,要转换成整形。这个时候会出现如下情况:

  1. area算术平方根刚刚好就是整数,强制转换不丢失精度;
  2. area算术平方根是一个小数,强制转换丢失精度;

我们要注意第二种情况,强制转换成int,这个操作相当与一个下取整操作,只保留整数,而丢弃后面的小数部分。所以转换后的q*q可能不等于area

代码第9行,不管q的值是多少,我们可以判断的是它一定是离area的算术平方根最近的一个整数,这一行的作用就是,按照我们上面说的逻辑,要找到一对整数值距离算术平方根最近,我们意识中会认为可以向左找,也可以向右找。事实是,我们应该向左,而不是向右,因为上面说了强制转换是下取整,意味着q是小于等于area的算术平方根的,那么我们应该按照这个方向去找,虽然向右也能找到,但是你需要额外判断最终的q和area/q哪个大,因为返回值有要求,值大的要放在前面。大家可以试试area是分别是2和21的时候的情况。

a336f7c5d45a784b68bf9a973f9c7db1.png

Java语言的实现:

Java 的实现和C语言的实现一致,不再撰述。

代码如下:

88720a3343c83a00c3ce6c5362041a91.png
dc5afe6f8a0b9346620cedb11a3657df.png

python语言的实现:

python 的实现和C语言的实现一致,不再撰述。

代码如下:

19f6e6398c943d852cb188221034f028.png
bdad96b78818a261eb7982d2834c5d41.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值