【Leetcode】 - Divide Two Integers 位运算实现整数除法
实现两个整数的除法,不许用乘法、除法和求模。题目被贴上了BinarySearch,但我没理解为什么会和BinarySearch有关系。我想的方法也和BS一点关系都没有。
很早以前我就猜想,整数的乘法是不是总是可以用移位和加法来实现?当然可以了,任何整数都可以写成2n或2n+1的形式,移位就是那个乘以2,加法就是最后的+1了嘛。复杂度是O(1),因为整数的移位最多32次,因此在循环中移位的次数也极其有限。
例如123/5:
5 123
<<1
<<1
<<1
<<1
5*16 = 80
5 123-80=43
<<1
<<1
<<1
5*8 = 40
5 43-40=3
5<3, thus result = 16+8 = 24
(if dividend == 125, finally we have:
5==5, thus result = 16+8+1 = 25;)
于是:
int divide(long long a, long long b) {
if(b==) return a>=?0x7fffffff:0x80000000;
if(a==) return ;
if(b==) return a;
int sgn = (a^b) & 0x80000000; //0 -> +, 0x80000000 -> -
if(a<) a=-a;
if(b<) b=-b;
//a,b>0
if(a<b) return ;
int res = , _b = b, twon;
while(a>b)
{
twon = ;
while(a>b)
{
b<<=;
twon<<=;
}
b>>=;
twon>>=;
a -= b;
b = _b;
res += twon;
}
if(a==b) res++;
if(sgn)
return -res;
else return res;
}
Leetcode上测试时间为36ms。
这里玩了一个小trick,用long long而不是int来存变量了,主要是防止被除数太大时除数移位会溢出变成负数。当然去掉long long也不难啦,加上溢出的判断就好了。只不过,这里的溢出判断和函数atoi是有所不同的,atoi中的result每次乘以10再加上0-9,而这边是乘以2。以上。
【Leetcode】 - Divide Two Integers 位运算实现整数除法的更多相关文章
- LeetCode: Divide Two Integers 解题报告
Divide Two Integers Divide two integers without using multiplication, division and mod operator. SOL ...
- Leetcode Divide Two Integers
Divide two integers without using multiplication, division and mod operator. 不用乘.除.求余操作,返回两整数相除的结果,结 ...
- leetcode:single-number-ii(Java位运算)
题目 Given an array of integers, every element appears three times except for one. Find that single on ...
- [LeetCode] Divide Two Integers 两数相除
Divide two integers without using multiplication, division and mod operator. If it is overflow, retu ...
- [LeetCode] Divide Two Integers( bit + 二分法 )
Divide two integers without using multiplication, division and mod operator. 常常出现大的负数,无法用abs()转换成正数的 ...
- Leetcode:Divide Two Integers分析和实现
题目要求我们用一个32位整数整除另外一个整数,但是不允许我们使用除法,乘法和取模运算. 有趣的问题,下面说一下我的思路: 首先,先给出两个正整数除法运算的过程.假设a为被除数,而b为除数.在计算机中无 ...
- leetcode Single Number II - 位运算处理数组中的数
题目描述: 给定一个包含n个整数的数组,除了一个数出现一次外所有的整数均出现三次,找出这个只出现一次的整数. 题目来源: http://oj.leetcode.com/problems/single- ...
- [LeetCode] Single Number II 位运算
Given an array of integers, every element appears three times except for one. Find that single one. ...
- leetcode Divide Two Integers python
class Solution(object): def divide(self, dividend, divisor): """ :type dividend: int ...
随机推荐
- html DOM 变化 通知,很好很强大
刚做一个项目,某个div标签显示后 需要接收一个事件,用于主动调用 window.resize(): 从网上找了了,发现 MutationObserver.给开发者们提供了一种能在某个范围内的DOM树 ...
- php学习笔记6--php中的文件包含 include,require,include_once,require_once
php中的文件包含 include,require,include_once,require_once 文件包含:是指将一个文件的内容包含进另外一个文件,有利于代码的复用等.php中文件包含指令有4个 ...
- 北大ACM(POJ1008-Maya Calendar)
Question:http://poj.org/problem?id=1008 问题点:日历转换. Memory: 280K Time: 16MS Language: C++ Result: Acce ...
- Android webkit 事件传递流程详解
前言:基于android webview 上定制自己使用的可移植浏览器apk,遇到好多按键处理的问题.所以索性研究了一下keyevent 事件的传递流程. frameworks 层 keyevent ...
- Exchange之证书申请
1. 打开EMC,选择服务器配置,然后右击新建证书 2. 输入一个好记的名称 3. 这里申请通配符证书 4. 填 ...
- js数组与字符串的相互转换方法
一.数组转字符串 需要将数组元素用某个字符连接成字符串,示例代码如下: var a, b; a = new Array(0,1,2,3,4); b = a.join("-"); 二 ...
- 【学习笔记】【C语言】结构体
1.定义结构体变量的3种方式 1> 先定义类型,再定义变量(分开定义) struct Student { int age; }; struct Student stu; 2> 定义 ...
- 9款完美体验的HTML5/jQuery应用
1.jQuery动画图标菜单导航 仿苹果样式 这次要分享的这款jQuery插件非常酷,它是一款带有动画按钮的jQuery菜单插件.而且从菜单的外观上来看,有点苹果菜单风格的味道.当我们将鼠标滑过菜单项 ...
- 在hibernate中使用c3p0数据源
1. jar包 hibernate-release-4.1.8.Final\lib\optional\c3p0 2. 加入配置: <!-- 数据库连接池最大连接数 --> &l ...
- 《RHEL6硬盘的分区和swap分区管理》——硬盘分区的大总结
首先介绍下几个简单的命令: free查看当前系统内存的使用情况 查看分区的使用情况:T类型.H显示大小以G,M 查看系统所有硬盘的分区信息:分区的没分区的都显示出来了 开始分区:为什么要加cu 不加 ...