Skip to content

Commit 619faf9

Browse files
add problem 29 and test function
1 parent 2e7ede5 commit 619faf9

File tree

1 file changed

+44
-0
lines changed

1 file changed

+44
-0
lines changed

C/1-50/29-Divide-Two-Integers.c

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
/*
2+
* Divide two integers without using multiplication, division and mod operator.
3+
4+
* If it is overflow, return MAX_INT.
5+
* Created by supercoderx on 2017/8/11.
6+
*/
7+
#include
8+
#include
9+
10+
int divide(int dividend, int divisor) {
11+
if (divisor == 0 || (dividend == INT_MIN) && (divisor == -1)) {
12+
return INT_MAX;
13+
}
14+
if (dividend == INT_MIN && divisor == 1)
15+
return INT_MIN;
16+
int neg = 0;
17+
if ((dividend > 0) ^ (divisor > 0)) {
18+
neg = 1;
19+
}
20+
long long dvd = dividend, dvs = divisor;
21+
if (dividend < 0) {
22+
dvd = -dvd;
23+
}
24+
if (divisor < 0) {
25+
dvs = -dvs;
26+
}
27+
28+
29+
int res = 0;
30+
while (dvd >= dvs) {
31+
long long temp = dvs, scala = 1;
32+
while (dvd >= (temp << 1)) {
33+
temp <<= 1;
34+
scala <<= 1;
35+
}
36+
dvd -= temp;
37+
res += scala;
38+
}
39+
return neg == 1 ? -res : res;
40+
}
41+
42+
void testDivide() {
43+
printf("%d", divide(-2147483648, 2));
44+
}

0 commit comments

Comments
 (0)