boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
JobHunting版 - 问一道 ama的除法题
相关主题
关于除法的问题
M 家电面
leetcode: Divide Two Integers 怎么做?
Amazon 面试题
这道题,怎么做呀?
某银行的笔试题
计算乘法和除法,不用乘法和除法符号,怎么scale
两个整数除法的问题太刁钻了吧
FB电面面筋顺求refer
在整数数组中加运算符号和括号,求max
相关话题的讨论汇总
话题: int话题: sign话题: divisor话题: dividend话题: else
进入JobHunting版参与讨论
1 (共1页)
y***m
发帖数: 7027
1
五、实现一个整数除法的函数,不使用除号,可以使用加号、减号和乘号,函数只返回
商.
function(int x,y){
n=x;k=0;
while(n>y){
n=n-y;
k++;
}
return k;
}
p******r
发帖数: 2999
2
you can only get 60pts with this algorithm

【在 y***m 的大作中提到】
: 五、实现一个整数除法的函数,不使用除号,可以使用加号、减号和乘号,函数只返回
: 商.
: function(int x,y){
: n=x;k=0;
: while(n>y){
: n=n-y;
: k++;
: }
: return k;
: }

s*****n
发帖数: 231
3
agree, how about the sign?
l*****a
发帖数: 14598
4
the most important
what will happen if y==0

【在 y***m 的大作中提到】
: 五、实现一个整数除法的函数,不使用除号,可以使用加号、减号和乘号,函数只返回
: 商.
: function(int x,y){
: n=x;k=0;
: while(n>y){
: n=n-y;
: k++;
: }
: return k;
: }

R***i
发帖数: 78
5
还有一个bug, x,y相等时,k=0

【在 l*****a 的大作中提到】
: the most important
: what will happen if y==0

e*****e
发帖数: 1275
6
而且你要学会用shift.
其实我最喜欢用E^(log(X)-log(Y))
可惜他们不喜欢...
f*********i
发帖数: 197
7
这个方法很好啊,赞一个,为什么他们不喜欢?

【在 e*****e 的大作中提到】
: 而且你要学会用shift.
: 其实我最喜欢用E^(log(X)-log(Y))
: 可惜他们不喜欢...

l*****a
发帖数: 14598
8
你觉得这个精确吗?
after u got log(x)

【在 f*********i 的大作中提到】
: 这个方法很好啊,赞一个,为什么他们不喜欢?
Z**********4
发帖数: 528
9
public static double Mydivide(int a, int b, int n)
{
if(b==0)
{
System.out.println("b is 0, Error!");
System.exit(1);
}
double A=a;
double B=b;
double PartInt=0;
while(A>=B)
{
PartInt=PartInt+1.0;
A-=B;
}
double t=0.1;
double PartDeci=0;
while(n>0)
{
B=B*0.1;
for(int i=0;i<10;i++)
{
if(A>=B)
{
PartDeci+=t;
A-=B;
}
}
t=t*0.1;
n--;
}
return (PartInt+PartDeci);
}
这个算的是a/b 保留n位小数
Z**********4
发帖数: 528
10
我这个是都是正整数情况
如果有负数的话稍微改改就行 用迭代
相关主题
Amazon 面试题
这道题,怎么做呀?
某银行的笔试题
计算乘法和除法,不用乘法和除法符号,怎么scale
进入JobHunting版参与讨论
r*****e
发帖数: 792
11
用那么多double的干什么,有点画蛇添足啊,原题只要返回整数的商就好了。
我写了个递归的,用对除数移位的方法,不过不知道是不是有更好的算法?
正在把递归的改成非递归的。

【在 Z**********4 的大作中提到】
: 我这个是都是正整数情况
: 如果有负数的话稍微改改就行 用迭代

v*****d
发帖数: 348
12
呵呵,我被A家考到过这题。m/n, 商的范围是[0,m], 用binary search

【在 y***m 的大作中提到】
: 五、实现一个整数除法的函数,不使用除号,可以使用加号、减号和乘号,函数只返回
: 商.
: function(int x,y){
: n=x;k=0;
: while(n>y){
: n=n-y;
: k++;
: }
: return k;
: }

v*****d
发帖数: 348
13
然后这个"binary"用右移实现

【在 v*****d 的大作中提到】
: 呵呵,我被A家考到过这题。m/n, 商的范围是[0,m], 用binary search
C***y
发帖数: 2546
14
那每次得到middle以后,怎么得到middle*n?可以直接用乘法?还是也需要用加法实现?

【在 v*****d 的大作中提到】
: 然后这个"binary"用右移实现
v*****d
发帖数: 348
15
恩,可以用乘法。

现?

【在 C***y 的大作中提到】
: 那每次得到middle以后,怎么得到middle*n?可以直接用乘法?还是也需要用加法实现?
Z**********4
发帖数: 528
16
我这个不用double答案是不对的
你试试看

【在 r*****e 的大作中提到】
: 用那么多double的干什么,有点画蛇添足啊,原题只要返回整数的商就好了。
: 我写了个递归的,用对除数移位的方法,不过不知道是不是有更好的算法?
: 正在把递归的改成非递归的。

z*d
发帖数: 18
17
#include
#include
int divide (int x, int y) {
int m, n, sign_m, sign_n;
int j, k, l;
if (y == 0) {
printf("Dvided by 0 error! \n");
assert(0);
}
if (x < 0) {
m = -x;
sign_m = -1;
}
else {
m = x;
sign_m = 1;
}
if (y < 0) {
n = -y;
sign_n = -1;
}
else {
n = y;
sign_n = 1;
}
j = 0;
l = m;
while(1) {
k = (j+l)/2;
if (k*n > m)
l = k;
else
j = k;
if((j==l) || (j==(l-1)))
break;
}
if((sign_m + sign_n) == 0)
return -j;
else
return j;
}

【在 y***m 的大作中提到】
: 五、实现一个整数除法的函数,不使用除号,可以使用加号、减号和乘号,函数只返回
: 商.
: function(int x,y){
: n=x;k=0;
: while(n>y){
: n=n-y;
: k++;
: }
: return k;
: }

Z**********4
发帖数: 528
18
额。。汗一个 没有看到原题只要求整数。。。
恩恩

【在 r*****e 的大作中提到】
: 用那么多double的干什么,有点画蛇添足啊,原题只要返回整数的商就好了。
: 我写了个递归的,用对除数移位的方法,不过不知道是不是有更好的算法?
: 正在把递归的改成非递归的。

r*****e
发帖数: 792
19
你的code直接用了/啊!
还有做乘法的时候有可能
因为太大而出错,本来正的
变负了。还有一个建议,
变量名字长点好,要让自己
和别人好理解。都是ijklmn
的不好读。

【在 z*d 的大作中提到】
: #include
: #include
: int divide (int x, int y) {
: int m, n, sign_m, sign_n;
: int j, k, l;
: if (y == 0) {
: printf("Dvided by 0 error! \n");
: assert(0);
: }
: if (x < 0) {

z*d
发帖数: 18
20
Thanks. You're right.
For the divide by 2, is it OK to use right shift by 1 bit?
For potential overflow, we can use long to fix it. Right?

【在 r*****e 的大作中提到】
: 你的code直接用了/啊!
: 还有做乘法的时候有可能
: 因为太大而出错,本来正的
: 变负了。还有一个建议,
: 变量名字长点好,要让自己
: 和别人好理解。都是ijklmn
: 的不好读。

相关主题
两个整数除法的问题太刁钻了吧
FB电面面筋顺求refer
在整数数组中加运算符号和括号,求max
来问一道面试题,除以很大的数
进入JobHunting版参与讨论
z*d
发帖数: 18
21
How about this one? Any suggestions or corrections will be highly
appreciated.
#include
#include
int divide (int x, int y) {
long long dividend, divisor, sign_dividend, sign_divisor;
long long low, middle, high;
int quotient;
/* check whether divisor is 0 */
if (y == 0) {
printf("Dvided by 0 error! \n");
assert(0);
}

/* unsign both dividend and divisor and mark the signess */
if (x < 0) {
dividend = -x;
sign_dividend = -1;
}
else {
dividend = x;
sign_dividend = 1;
}
if (y < 0) {
divisor = -y;
sign_divisor = -1;
}
else {
divisor = y;
sign_divisor = 1;
}
/* case dividend is equal to divisor */
if(dividend == divisor) {
if((sign_dividend + sign_divisor) == 0)
return -1;
else
return 1;
}
/* case divisor is 1 */
if(divisor == 1) {
quotient = (int)dividend;
if((sign_dividend + sign_divisor) == 0)
return -quotient;
else
return quotient;
}
/* binary search the quotient */
low = 0;
high = dividend;
while(1) {
middle = (low+high)>>1;
if (middle*divisor > dividend)
high = middle;
else
low = middle;
if((low==high) || (low==(high-1)))
break;
}
if(high*divisor == dividend)
quotient = (int)high;
else
quotient = (int)low;
if((sign_dividend + sign_divisor) == 0)
return (-quotient);
else
return quotient;
}

【在 r*****e 的大作中提到】
: 你的code直接用了/啊!
: 还有做乘法的时候有可能
: 因为太大而出错,本来正的
: 变负了。还有一个建议,
: 变量名字长点好,要让自己
: 和别人好理解。都是ijklmn
: 的不好读。

r*****e
发帖数: 792
22
I guess the right shift is allowed.
But I still think there is a possibility to have overflow
even though long is used. Actually, I don't think multiplication
is needed and I think sub/add is enough to avoid potential problem
and also good for performance, i.e., faster than multiplication
when you think the deeper implementation.
Have not written my own version by bin-search though.

【在 z*d 的大作中提到】
: Thanks. You're right.
: For the divide by 2, is it OK to use right shift by 1 bit?
: For potential overflow, we can use long to fix it. Right?

z*d
发帖数: 18
23
With long long type, it should be ok for the overflow issue, I think.
As for the performance, I'm also curious whether there is binary search
solution with only add/sub operations, instead of multiplication.

【在 r*****e 的大作中提到】
: I guess the right shift is allowed.
: But I still think there is a possibility to have overflow
: even though long is used. Actually, I don't think multiplication
: is needed and I think sub/add is enough to avoid potential problem
: and also good for performance, i.e., faster than multiplication
: when you think the deeper implementation.
: Have not written my own version by bin-search though.

y***m
发帖数: 7027
24
看来还是蛮多细节疏忽了...
function int calc(int x,y){
if(y==0)
return null;
else if (x==0)
return 0;

if (x>0)
c = 1;
else
c = -1;

if (y>0)
d = 1;
else
d = -1;

int n = x*c;
int m = y*d;
if(n return 0;

int k=0;
while(n>=m){
k++;
n=n-m;
}
return k*c*d;
}

【在 l*****a 的大作中提到】
: the most important
: what will happen if y==0

1 (共1页)
进入JobHunting版参与讨论
相关主题
在整数数组中加运算符号和括号,求max
来问一道面试题,除以很大的数
Divide Two Integers
leetcode上的2个整数相除
leecode上的divide two integers问题
两整数相除问题
关于Divide a integer
divide two integers
Divide Two Integers OJ和CCP150的做法
算法题求助
相关话题的讨论汇总
话题: int话题: sign话题: divisor话题: dividend话题: else