029两数相除

  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 }

猜你喜欢

转载自www.cnblogs.com/zzw1024/p/10530514.html