fork download
  1. #include <iostream>
  2. #include <cassert>
  3.  
  4. using namespace std;
  5.  
  6. void Add(int num1, int den1, int num2, int den2, int & result_num, int & result_den);
  7.  
  8. void Sub(int num1, int den1, int num2, int den2, int& result_num, int& result_den);
  9.  
  10. void Mpy(int num1, int den1, int num2, int den2, int& result_num, int& result_den);
  11.  
  12. void Div(int num1, int den1, int num2, int den2, int result_num, int result_den);
  13.  
  14. int lcm(int m, int n);
  15.  
  16. int gcd(int n, int m);
  17.  
  18. void Reduction(int num, int den, int& result_num, int& result_den); //reduction함수의 첫번째 두번째 인자는 사칙연산의 결과의 분자/분모이다.
  19.  
  20. int main()
  21. {
  22.  
  23. int a, b, c, d;
  24.  
  25. int resultNum, resultDen;
  26.  
  27. cout << "분자/분모를 차례대로 입력하시오(분모에 0넣으면 Error!)" << endl;
  28. cout << "(음수인 분수는 분자에 음수를 입력해주세요 !! : ";
  29. cin >> a >> b >> c >> d;
  30.  
  31. assert(b != 0 && d != 0);
  32.  
  33. /*모든 사칙연산 계산 함수에 자동 약분까지 되어 산출*/
  34. Add(a, b, c, d, resultNum, resultDen); //덧셈
  35.  
  36. Sub(a, b, c, d, resultNum, resultDen); //뺄셈
  37.  
  38. Mpy(a, b, c, d, resultNum, resultDen); //곱셈
  39.  
  40. Div(a, b, c, d, resultNum, resultDen); //나눗셈
  41.  
  42. cout << endl; // 깔끔한 개행
  43.  
  44. return 0; // 종료
  45. }
  46. void Add(int num1, int den1, int num2, int den2, int & result_num, int & result_den)
  47. {
  48.  
  49. int add_num, add_den;
  50. result_den = lcm(den1, den2);
  51. result_num = (result_den / den1)*num1 + (result_den / den2)*num2;
  52.  
  53. if (result_den < 0 && result_num>0)
  54. {
  55. int minus_to_plus_den = -result_den;
  56. Reduction(result_num, minus_to_plus_den, add_num, add_den);
  57. }
  58. else if (result_num < 0 && result_num>0)
  59. {
  60. int minus_to_plus_num = -result_num;
  61. Reduction(minus_to_plus_num, result_den, add_num, add_den);
  62. }
  63. else if (result_den < 0 && result_num < 0)
  64. {
  65. result_den = -result_den;
  66. result_num = -result_num;
  67. Reduction(result_num, result_den, add_num, add_den);
  68. }
  69. //조건 : 연산만되고 약분이안된 분수의 분자, 분모의 음수 여부를 체크한다 이유는 약분하는 함수(Reduction)에 gcd가 필요한데 음수가 있으면 gcd가 돌아가지를 않는다
  70. // 그래서 일단 지역변수선언해서 그 지역변수의 연산만된 분수를 양수화 하고 약분하는 함수에 넣는다. Reduction에 넣으면 약분이 되어 참조자로 주소값이 참조되어 빠져나온다.
  71.  
  72. if (result_num % result_den == 0) // 약분했는데 분모가 분자로 나눠지는경우와 분모가 1인경우 분수를 정수로 표현하는 조건이다.
  73. {
  74. cout << "(" << num1 << "/" << den1 << ")+" << "(" << num2 << "/" << den2 << ")=" << result_num/result_den << endl;
  75. }
  76. else
  77. {
  78. cout << "(" << num1 << "/" << den1 << ")+" << "(" << num2 << "/" << den2 << ")=" << result_num << "/" << result_den << endl;
  79. }
  80.  
  81. }
  82.  
  83. void Sub(int num1, int den1, int num2, int den2, int& result_num, int& result_den){
  84.  
  85. int sub_num, sub_den;
  86. result_den = lcm(den1, den2);
  87. result_num = (result_den / den1)*num1 - (result_den / den2)*num2;
  88.  
  89.  
  90. if (result_den < 0 && result_num>0)
  91. {
  92. int minus_to_plus_den = -result_den;
  93. Reduction(result_num, minus_to_plus_den, sub_num, sub_den);
  94. }
  95. else if (result_num < 0 && result_num>0)
  96. {
  97. int minus_to_plus_num = -result_num;
  98. Reduction(minus_to_plus_num, result_den, sub_num, sub_den);
  99. }
  100. else if (result_den < 0 && result_num < 0)
  101. {
  102. result_den = -result_den;
  103. result_num =-result_num;
  104. Reduction(result_num, result_den, sub_num, sub_den);
  105. }
  106.  
  107.  
  108.  
  109. if (result_num % result_den == 0)
  110. {
  111. cout << "(" << num1 << "/" << den1 << ")-" << "(" << num2 << "/" << den2 << ")=" << result_num / result_den << endl;
  112. }
  113. else{
  114. cout << "(" << num1 << "/" << den1 << ")-" << "(" << num2 << "/" << den2 << ")=" << result_num << "/" << result_den << endl;
  115. }
  116. }
  117. void Mpy(int num1, int den1, int num2, int den2, int& result_num, int& result_den){
  118.  
  119.  
  120. int mpy_num, mpy_den;
  121. result_num = num1*num2;
  122. result_den = den1*den2;
  123.  
  124.  
  125. if (result_den < 0 && result_num > 0)
  126. {
  127. int minus_to_plus_den = -result_den;
  128. Reduction(result_num, minus_to_plus_den, mpy_num, mpy_den);
  129. }
  130. else if (result_num < 0 && result_num > 0)
  131. {
  132. int minus_to_plus_num = -result_num;
  133. Reduction(minus_to_plus_num, result_den, mpy_num, mpy_den);
  134. }
  135. else if (result_den < 0 && result_num < 0)
  136. {
  137. result_den = -result_den;
  138. result_num = -result_num;
  139. Reduction(result_num, result_den, mpy_num, mpy_den);
  140. }
  141.  
  142.  
  143.  
  144.  
  145. if (result_num % result_den == 0)
  146. {
  147. cout << "(" << num1 << "/" << den1 << ")*" << "(" << num2 << "/" << den2 << ")=" << result_num / result_den << endl;
  148. }
  149. else
  150. {
  151. cout << "(" << num1 << "/" << den1 << ")*" << "(" << num2 << "/" << den2 << ")=" << result_num << "/" << result_den << endl;
  152. }
  153. }
  154.  
  155.  
  156. void Div(int num1, int den1, int num2, int den2, int result_num, int result_den){
  157.  
  158.  
  159. int div_num, div_den;
  160. result_num = num1*den2;
  161. result_den = num2*den1;
  162. if (result_den < 0 && result_num>0)
  163. {
  164. int minus_to_plus_den = -result_den;
  165. Reduction(result_num, minus_to_plus_den, div_num, div_den);
  166. }
  167. else if (result_num < 0 && result_num>0)
  168. {
  169. int minus_to_plus_num = -result_num;
  170. Reduction(minus_to_plus_num, result_den, div_num, div_den);
  171. }
  172. else if (result_den < 0 && result_num < 0)
  173. {
  174. result_den = -result_den;
  175. result_num = -result_num;
  176. Reduction(result_num, result_den, div_num, div_den);
  177. }
  178. if (result_num % result_den == 0)
  179. {
  180. cout << "(" << num1 << "/" << den1 << ")/" << "(" << num2 << "/" << den2 << ")=" << result_num / result_den << endl;
  181. }
  182. else
  183. {
  184. cout << "(" << num1 << "/" << den1 << ")/" << "(" << num2 << "/" << den2 << ")=" << result_num << "/" << result_den << endl;
  185. }
  186. }
  187.  
  188. int lcm(int m, int n){
  189.  
  190.  
  191. int m1 = m / gcd(n, m); // 최소공배수 통분했을때 나오는 최대공약수 제외한 나머지 값
  192. int n1 = n / gcd(n, m);
  193.  
  194. return gcd(n, m) * m1 * n1; // 최대 공약수 랑 통분했을 시 나오는 수들의 곱셈
  195. }
  196.  
  197. int gcd(int n, int m) {
  198.  
  199. if (m > n)
  200. {
  201. int temp;
  202. temp = n;
  203. n = m;
  204. m = temp;
  205.  
  206. if (m == 0){
  207. return n;
  208. }
  209. else
  210. {
  211. return gcd(m, n%m);
  212. }
  213.  
  214. }
  215. else
  216. {
  217. if (m == 0)
  218. return n;
  219. else
  220. return gcd(m, n%m);
  221.  
  222. }
  223.  
  224. }
  225.  
  226.  
  227.  
  228.  
  229. void Reduction(int num, int den, int& result_num, int& result_den) //reduction함수의 첫번째 두번째 인자는 사칙연산의 결과의 분자/분모이다.
  230. {
  231.  
  232. gcd(num, den);
  233.  
  234. result_num = num / gcd(num, den);
  235.  
  236. result_den = den / gcd(num, den);
  237.  
  238.  
  239. if (result_den == result_num)
  240. {
  241. result_den = 1;
  242. result_num = 1;
  243.  
  244. }
  245.  
  246.  
  247. }
  248. //// Reduction 함수가 안돌아가는거같음... 약분이 안됨......
  249.  
  250.  
Time limit exceeded #stdin #stdout 5s 3152KB
stdin
Standard input is empty
stdout
분자/분모를 차례대로 입력하시오(분모에 0넣으면 Error!)
(음수인 분수는 분자에 음수를 입력해주세요 !!  :