6,281
社区成员
发帖
与我相关
我的任务
分享题目描述

分析
需要计算除法的数值是多少,并且还遇到以下问题:
数值越界问题可以特殊情况考虑即可。但是不能使用乘除法怎么去知道除法的结果是多少呢?
法一:加法累加
这可能是最笨的方法了,除以几,就用这个数去叠加找到结果。

public static int divide(int dividend, int divisor) {
int zhengfu=1;
long divd=dividend,divs=divisor;
if(dividend>0&&divisor<0)
{
divs=-divisor;zhengfu=-1;
}
else if(dividend<0&&divisor>0)
{
divd=-divd;zhengfu=-1;
}
else if (dividend<0&&divisor<0) {
divd=-divd;divs=-divs;
}
if(Math.abs(divd)<Math.abs(divs))return 0;
long i=0,index=0;
if(divs==1)i=divd+1;
else
while (index<=divd) {
i++;index+=divs;
}
long va=(zhengfu==1?(i-1):(1-i));
if(va>Integer.MAX_VALUE)return Integer.MAX_VALUE;
if(va<Integer.MIN_VALUE)return Integer.MIN_VALUE;
return (int) va;
}

同样任何一个数都可以用二进制来表示,1101表示8+4+1.同理我们将这种思想带到本题进行计算,只不过基础单位不为1而已:

实现代码为:
public static int divide(int dividend, int divisor)
{
if(divisor==1)return dividend;
if(divisor==-1)return dividend==Integer.MIN_VALUE?Integer.MAX_VALUE:-dividend;
long value=0;//记录总次数结果
int time=1;//临时每次的次数
long divd=dividend,divs=divisor;//转成long处理
int zhengfu=1;//判断是正数还是负数
if(divd<0)
{
divd=-divd;zhengfu=-zhengfu;
}
if(divs<0)
{
divs=-divs;zhengfu=-zhengfu;
}
long team=divs;//临时数据2倍叠加
while (team<=divd) {
if(team+team>divd)
{
value+=time;
divd-=team;
team=divs;
time=1;
continue;
}
team+=team;
time+=time;
}
return (int) (zhengfu==1?value:-value);
}

文章作者: bigsai
文章来源:https://github.com/javasmall/bigsai-algorithm
版权声明:本文为博主bigsai原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处和本声明。