LintCode_两个整数相除

2024-04-10 08:32
文章标签 两个 整数 lintcode 相除

本文主要是介绍LintCode_两个整数相除,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

问题描述:

将两个整数相除,要求不使用乘法、除法和 mod 运算符。如果溢出,返回 2147483647 。

样例:给定被除数 = 100 ,除数 = 9,返回 11

算法思想:

方法一:(这是开始自己想出来的,算法思想简单,缺点是,循环次数多,运行速度慢

如果不能采用乘除运算方法,那么可以采用加减方式,当然还要(1)、注意分类:正正,正负,负正,负负;(2)、溢出问题;

    public static int divide(int dividend, int divisor) {if(divisor==0){return 2147483647;}if(dividend==0){return 0;}if(dividend==-2147483648&&divisor==-2147483648){return 1;}int result=0;//如果被除数为负数,除数为正数if(dividend<0&&divisor>0){//循环将除数加至被除数中,直至被除数大于或者等于0while((dividend+divisor)<=0){       dividend+=divisor;result--;}}else if(dividend>0&&divisor>0){//被除数与除数都是正数,直接计算,result++while((dividend-divisor)>=0){dividend-=divisor;result++;}}else if(dividend>0&&divisor<0){//被除数为正数,除数为负数,将除数转变成正数,result--while((dividend+divisor)>=0){dividend+=divisor;result--;}}else if(dividend<0&&divisor<0){while((dividend-divisor)<=0&&result<2147483647){//可能(-2147483648)/(-1)=2147483648,刚好导致溢出dividend=dividend-divisor;result++;}}return result;}

注: 此题在测试过程中,最纠结的就是碰到-2147483648等的溢出问题,例如被除数和除数都是-2147483648时,如果,在最开始没有使用
<pre name="code" class="java" style="color: rgb(113, 113, 113);">        if(dividend==-2147483648&&divisor==-2147483648){return 1;}
 
语句,result最终结果为 
2147483647。在负负情况下添加添加打印result和dividend的语句,可以看到result和dividend在while循环中的结果,很奇怪;如果被除数和除数是其他数据,运行结果正常。因此, 
这不是逻辑问题,而是溢出! 

方法二:百度了下别人的做法,发现可以使用位运算,减少循环步骤,大大减少了运算时间,在被除数很大,除数很小的时候很有优势。因为左移一位相当于数字乘2;所以有时左移右移运算配合加减法,就相当于乘除法;

    public static  int divide(int dividend, int divisor) {  // Write your code here  //判断dividend与divisor是否是同符号,同符号,结果为正,不同符号,结果为负数Boolean resultGreatThanZero = true;  if(dividend>0&&divisor<0||dividend<0&&divisor>0)  resultGreatThanZero = false;  //保存最终结果int ret = 0;//将d1与d2都转变成正数运算long d1 = abs((long)dividend);  long d2 = abs((long)divisor);  while(d1>=d2)  {  long temp = d2;  long cnt = 1;  while(d1>=temp)  {  d1-=temp;  ret+=cnt;//左移一位,相当于cnt乘2;//不能直接使用乘法运算,那么可以采用左移代表乘法,可以减少运算步骤cnt = cnt<<1;  temp = temp<<1;  }  }  if(!resultGreatThanZero)  ret*=-1;  //考虑到溢出if(ret<(long)INT_MIN||ret>(long)INT_MAX)  return (int) INT_MAX;  return (int) ret;  }  private static long abs(long divisor) {if(divisor<0){divisor=divisor*(-1);}return divisor;
}


这篇关于LintCode_两个整数相除的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/890557

相关文章

锐捷和腾达哪个好? 两个品牌路由器对比分析

《锐捷和腾达哪个好?两个品牌路由器对比分析》在选择路由器时,Tenda和锐捷都是备受关注的品牌,各自有独特的产品特点和市场定位,选择哪个品牌的路由器更合适,实际上取决于你的具体需求和使用场景,我们从... 在选购路由器时,锐捷和腾达都是市场上备受关注的品牌,但它们的定位和特点却有所不同。锐捷更偏向企业级和专

PTA求一批整数中出现最多的个位数字

作者 徐镜春 单位 浙江大学 给定一批整数,分析每个整数的每一位数字,求出现次数最多的个位数字。例如给定3个整数1234、2345、3456,其中出现最多次数的数字是3和4,均出现了3次。 输入格式: 输入在第1行中给出正整数N(≤1000),在第二行中给出N个不超过整型范围的非负整数,数字间以空格分隔。 输出格式: 在一行中按格式“M: n1 n2 ...”输出,其中M是最大次数,n

整数Hash散列总结

方法:    step1  :线性探测  step2 散列   当 h(k)位置已经存储有元素的时候,依次探查(h(k)+i) mod S, i=1,2,3…,直到找到空的存储单元为止。其中,S为 数组长度。 HDU 1496   a*x1^2+b*x2^2+c*x3^2+d*x4^2=0 。 x在 [-100,100] 解的个数  const int MaxN = 3000

两个月冲刺软考——访问位与修改位的题型(淘汰哪一页);内聚的类型;关于码制的知识点;地址映射的相关内容

1.访问位与修改位的题型(淘汰哪一页) 访问位:为1时表示在内存期间被访问过,为0时表示未被访问;修改位:为1时表示该页面自从被装入内存后被修改过,为0时表示未修改过。 置换页面时,最先置换访问位和修改位为00的,其次是01(没被访问但被修改过)的,之后是10(被访问了但没被修改过),最后是11。 2.内聚的类型 功能内聚:完成一个单一功能,各个部分协同工作,缺一不可。 顺序内聚:

2024年AMC10美国数学竞赛倒计时两个月:吃透1250道真题和知识点(持续)

根据通知,2024年AMC10美国数学竞赛的报名还有两周,正式比赛还有两个月就要开始了。计划参赛的孩子们要记好时间,认真备考,最后冲刺再提高成绩。 那么如何备考2024年AMC10美国数学竞赛呢?做真题,吃透真题和背后的知识点是备考AMC8、AMC10有效的方法之一。通过做真题,可以帮助孩子找到真实竞赛的感觉,而且更加贴近比赛的内容,可以通过真题查漏补缺,更有针对性的补齐知识的短板。

单精度浮点数按存储格式转为整数的程序

///#include<cstdio>//-----------------union int_char{unsigned char ch[4];float i;};void out_put(union int_char x)//x86是小端对其模式,即最数据的最低位存储在地址的最低位上。{printf("单精度浮点数值为:%f\n",x.i,x.i);printf("存储位置从左到右

两个长数字相加

1.编程题目 题目:要实现两个百位长的数字直接相加 分析:因为数字太长所以无法直接相加,所以采用按位相加,然后组装的方式。(注意进位) 2.编程实现 package com.sino.daily.code_2019_6_29;import org.apache.commons.lang3.StringUtils;/*** create by 2019-06-29 19:03** @autho

创建一个大的DIV,里面的包含两个DIV是可以自由移动

创建一个大的DIV,里面的包含两个DIV是可以自由移动 <body>         <div style="position: relative; background:#DDF8CF;line-height: 50px"> <div style="text-align: center; width: 100%;padding-top: 0px;"><h3>定&nbsp;位&nbsp;

在二叉树中找到两个节点的最近公共祖先(基于Java)

如题  题解 public int lowestCommonAncestor(TreeNode root, int o1, int o2) {//记录遍历到的每个节点的父节点。Map<Integer, Integer> parent = new HashMap<>();Queue<TreeNode> queue = new LinkedList<>();parent.put(roo

Java中计算两个日期间隔多少天

String dbtime1 = "2017-02-23";  //第二个日期 String dbtime2 = "2017-02-22";  //第一个日期 //算两个日期间隔多少天 SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); Date date1 = format.parse(dbtime1); Date dat