[关闭]
@Lin-- 2018-10-24T15:00:54.000000Z 字数 3084 阅读 334

作业8:除法

计算机数学

Given two integers dividend and divisor, divide two integers without using multiplication, division and mod operator.

Return the quotient after dividing dividend by divisor.

The integer division should truncate toward zero.

Example 1:

Input: dividend = 10, divisor = 3
Output: 3
Example 2:

Input: dividend = 7, divisor = -3
Output: -2
Note:

*Both dividend and divisor will be 32-bit signed integers.
*The divisor will never be 0.
*Assume we are dealing with an environment which could only store integers within the 32-bit signed integer range: [−231, 231 − 1]. For the purpose of this problem, assume that your function returns 231 − 1 when the division result overflows.


  1. /*
  2. *File:divide.c
  3. *Author:Hongpei lin
  4. *Date:20181024
  5. *Purpose:to solve the problem in Leetcode
  6. *https://leetcode.com/problems/divide-two-integers/description/
  7. */
  8. #include<stdio.h>
  9. #include<math.h>
  10. #include<limits.h>
  11. /**
  12. * Declaration of functions.
  13. *Input a integer dividend and a integer divisor
  14. *Output a integer that equal dividend/divisor
  15. *Method:this algorithm is divided several circumstances
  16. *0:special circumstances:return special result straight
  17. *1:dividend>0 and divisor>0 return dividend/divisor
  18. *2:dividend>0 and divisor<0
  19. *let divisor=-divisor,so divisor>0,then return dividend/divisor
  20. *3:dividend<0 and divisor>0
  21. *let dividend=-dividend,so dividend>0,then return dividend/divisor
  22. *4:dividend<0 and dividend<0
  23. *let dividend=-dividend,divisor=-divisor
  24. *so dividend>0 and divisor>0
  25. *from circumstance 1rd to circumstance 4th
  26. *include some special circumstances,that return special result
  27. **/
  28. //functions division
  29. //algorithm division by using circular subtraction
  30. int division(int a,int b);
  31. int divide(int dividend,int divisor)
  32. {
  33. //0:
  34. //when dividend=0 or divisor=-2^31 and dividend!=-2^31
  35. //return 0;because no one can divide -2^31 when consider overflow
  36. if(dividend==0||((dividend!=divisor)&&divisor==INT_MIN))return 0;
  37. //if divided=1, result=dividend
  38. if(divisor==1) return dividend;
  39. //if dividend=-2^31 and divisor=-1,result=-dividend=2^31
  40. //but 2^31 is overflow, so result=2^31-1
  41. if(dividend==INT_MIN&&divisor==-1) return 2147483647;
  42. //if divisor=-1, result=-dividend(dividend!=-2^31)
  43. if(divisor==-1)return -dividend;
  44. //if dividend=divisor, result=1
  45. if(dividend==divisor)return 1;
  46. //1:
  47. if(dividend>0&&divisor>0) return division(dividend,divisor);
  48. //2:
  49. else if(dividend>0&&divisor<0)//2
  50. {
  51. divisor=fabs(divisor);
  52. //function "division" just return positive numbers and 0
  53. //but result<0,so let result=-division's result
  54. return -division(dividend,divisor);
  55. }
  56. //3:
  57. else if(dividend<0&&divisor>0)
  58. {
  59. //same process
  60. if(dividend!=INT_MIN)
  61. {
  62. dividend=fabs(dividend);
  63. return -division(dividend,divisor);
  64. }
  65. //if dividend=-2^31
  66. else
  67. {
  68. int result=0;
  69. //let dividend=2^31-1
  70. dividend=INT_MAX;
  71. //compute (2^31-1)/divisor
  72. while(dividend>=divisor)
  73. {
  74. dividend=dividend-divisor;
  75. result++;
  76. }
  77. //rest=|-2^31-(2^31-1)|=1
  78. dividend=dividend+1;
  79. if(dividend==divisor)return -(result+1);
  80. else return -result;
  81. }
  82. }
  83. //4:
  84. //same process
  85. else if(dividend<0&&divisor<0)
  86. {
  87. if(dividend==INT_MIN)
  88. {
  89. dividend=INT_MAX;
  90. divisor=fabs(divisor);
  91. int result=0;
  92. while(dividend>=divisor)
  93. {
  94. dividend=dividend-divisor;
  95. result++;
  96. }
  97. dividend=dividend+1;
  98. if(dividend==divisor)return (result+1);
  99. else return result;
  100. }
  101. else
  102. {
  103. dividend=fabs(dividend);
  104. divisor=fabs(divisor);
  105. return division(dividend,divisor);
  106. }
  107. }
  108. return 0;
  109. }
  110. //function division
  111. int division(int a,int b)
  112. {
  113. int c=0;
  114. while(a>=b)
  115. {
  116. a=a-b;
  117. c++;
  118. }
  119. return c;
  120. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注