1 #pragma once
2 #include "000库函数.h"
3 /******************自解***********************/
4 //虽然很快通过,但不满足题中不允许使用除法的要求 36ms
5 class Solution {
6 public:
7 int divide(int dividend, int divisor) {
8 if (divisor == 0)return 0;
9 double i = (double)dividend / (double)divisor;
10 if ((i < -1 * pow(2, 31)) || (i > pow(2, 31) - 1))return pow(2, 31) - 1;
11 else return (int)i;
12 }
13 };
14 //超出时长
15 class Solution {
16 public:
17 int divide(int dividend, int divisor) {
18 if (divisor == 0)return 0;
19 int flag = 1;
20 double k = (double)dividend;
21 if (k < 0) {
22 k *= -1;//防止此处溢出
23 flag *= -1;
24 }
25 double t = (double)divisor;
26 if (t < 0) {
27 t *= -1;
28 flag *= -1;
29 }
30 double i= 0;
31 double n = t;
32 while (k >= t+t) {
33 i += 2;
34 t += n;
35 k -= n;
36
37 }
38 if (k >= t)
39 ++i;
40 i *= flag;
41 if ((i < -1 * pow(2, 31)) || (i > pow(2, 31) - 1))return pow(2, 31) - 1;
42 else return (int)i;
43 }
44 };
45 /*********************博客答案***************************/
46 //采用移位运算 36ms
47 class Solution {
48 public:
49 int divide(int dividend, int divisor) {
50 if (divisor == 0 || (dividend == INT_MIN && divisor == -1)) return INT_MAX;
51 long long m = abs((long long)dividend), n = abs((long long)divisor), res = 0;
52 int sign = ((dividend < 0) ^ (divisor < 0)) ? -1 : 1;
53 if (n == 1) return sign == 1 ? m : -m;
54 while (m >= n) {
55 long long t = n, p = 1;
56 while (m >= (t << 1)) {
57 t <<= 1;
58 p <<= 1;
59 }
60 res += p;
61 m -= t;
62 }
63 return sign == 1 ? res : -res;
64 }
65 };
66
67 class Solution {
68 public:
69 int divide(int dividend, int divisor) {
70 long long m = abs((long long)dividend), n = abs((long long)divisor), res = 0;
71 if (m < n) return 0;
72 while (m >= n) {
73 long long t = n, p = 1;
74 while (m > (t << 1)) {
75 t <<= 1;
76 p <<= 1;
77 }
78 res += p;
79 m -= t;
80 }
81 if ((dividend < 0) ^ (divisor < 0)) res = -res;
82 return res > INT_MAX ? INT_MAX : res;
83 }
84 };
85 //使用递归 36ms
86 class Solution {
87 public:
88 int divide(int dividend, int divisor) {
89 long long res = 0;
90 long long m = abs((long long)dividend), n = abs((long long)divisor);
91 if (m < n) return 0;
92 long long t = n, p = 1;
93 while (m > (t << 1)) {
94 t <<= 1;
95 p <<= 1;
96 }
97 res += p + divide(m - t, n);
98 if ((dividend < 0) ^ (divisor < 0)) res = -res;
99 return res > INT_MAX ? INT_MAX : res;
100 }
101 };
102
103
104 void T029() {
105 Solution s;
106 cout << s.divide(10, 3) << endl;
107 cout << s.divide(7, -3) << endl;
108 }