【C++】实现有理数简单的算术

深藏阁楼爱情的钟 2021-12-09 04:23 293阅读 0赞

题目描述

输入两个分数形式的有理数,分别计算出二者 加法/减法/乘法/除法 的结果。

示例

在这里插入图片描述

实现代码

  1. #include <iostream>
  2. #include <vector>
  3. #include <string>
  4. #include <cmath>
  5. using namespace std;
  6. int GYS(int a, int b) //求最大公约数
  7. {
  8. int c = 0;
  9. while (c=a%b)
  10. {
  11. a = b;
  12. b = c;
  13. }
  14. return b;
  15. }
  16. string Itoa(int n) //实现int 到 string的类型转换
  17. {
  18. string s = "";
  19. int c = 0;
  20. while (c = n % 10)
  21. {
  22. char a = c + '0';
  23. s.push_back(a);
  24. n /= 10;
  25. }
  26. reverse(s.begin(),s.end());
  27. return s;
  28. }
  29. vector<int> SzhuanV(string s) //将string 的字符串存放在vector中
  30. {
  31. vector<int> v;
  32. int pos=s.find('/', 0);
  33. int a = 0;
  34. int b = 0;
  35. for (int i = 0; i <pos; i++)
  36. a += (s[i] - '0')*pow(10,(pos - 1 - i));
  37. for (int i = pos+1; i <s.size(); i++)
  38. b += (s[i] - '0')*pow(10,(s.size() - 1 - i));
  39. v.push_back(b);
  40. v.push_back(a);
  41. return v;
  42. }
  43. string VzhuanF(vector<int> v) //将vector中的数据转化成分数形式
  44. {
  45. string s = "";
  46. if (v[0] == 0)
  47. s = "Ifo";
  48. else if (v[1] == 0)
  49. s = "0";
  50. else
  51. {
  52. string a = Itoa(v[1] / v[0]);
  53. string b = Itoa(v[1] % v[0]);
  54. string c = Itoa(v[0]);
  55. char d = '/';
  56. char e = ' ';
  57. if (a != "0")
  58. {
  59. s += a;
  60. s.push_back(e);
  61. }
  62. if (b != "")
  63. {
  64. s += b;
  65. s.push_back(d);
  66. s += c;
  67. }
  68. }
  69. return s;
  70. }
  71. vector <int> Add(vector<int> v1, vector<int>v2) //两个正有理数相加
  72. {
  73. vector<int> v;
  74. if (v1[1] == 0)
  75. v = v2;
  76. else if (v2[1] == 0)
  77. v = v1;
  78. else
  79. {
  80. int a = v1[0] * v2[0];
  81. int b = v1[1] * v2[0] + v2[1] * v1[0];
  82. int c = GYS(a, b);
  83. v.push_back(a / c);
  84. v.push_back(b / c);
  85. }
  86. return v;
  87. }
  88. vector <int> Sub(vector<int> v1, vector<int>v2) //结果为正的减法
  89. {
  90. vector<int> v;
  91. if (v1[1] == 0)
  92. v = v2;
  93. else if (v2[1] == 0)
  94. v = v1;
  95. else
  96. {
  97. int a = v1[0] * v2[0];
  98. int b = v1[1] * v2[0] - v2[1] * v1[0];
  99. int c = GYS(a, b);
  100. v.push_back(a / c);
  101. v.push_back(b / c);
  102. }
  103. return v;
  104. }
  105. vector <int> Mul(vector<int> v1, vector<int>v2) //两个正有理数的乘法
  106. {
  107. vector<int> v;
  108. if (v1[1] == 0 || v2[1] == 0)
  109. {
  110. v.push_back(v1[0]);
  111. v.push_back(0);
  112. }
  113. else
  114. {
  115. int b = v1[1] * v2[1];
  116. int a = v1[0] * v2[0];
  117. int c = GYS(a, b);
  118. v.push_back(a / c);
  119. v.push_back(b / c);
  120. }
  121. return v;
  122. }
  123. vector <int> Dev(vector<int> v1, vector<int>v2) //两个正有理数的除法
  124. {
  125. vector<int> v;
  126. if (v1[1] == 0)
  127. {
  128. v.push_back(v1[0]);
  129. v.push_back(0);
  130. }
  131. else if (v2[1] == 0)
  132. {
  133. v.push_back(0);
  134. }
  135. else
  136. {
  137. int a = v1[0] * v2[1];
  138. int b = v1[1] * v2[0];
  139. int c = GYS(a, b);
  140. v.push_back(a / c);
  141. v.push_back(b / c);
  142. }
  143. return v;
  144. }
  145. int main()
  146. {
  147. string s1,s2;
  148. while (cin>>s1>>s2)
  149. {
  150. vector<int> v1 = SzhuanV(s1);
  151. vector<int> v2 = SzhuanV(s2);
  152. vector <int> v_add = Add(v1, v2);
  153. string s_add = VzhuanF(v_add);
  154. cout <<"加法的结果是:"<< s_add << endl;
  155. vector <int> v_sub = Sub(v1, v2);
  156. string s_sub = VzhuanF(v_sub);
  157. cout << "减法的结果是:" << s_sub << endl;
  158. vector <int> v_mul = Mul(v1, v2);
  159. string s_mul = VzhuanF(v_mul);
  160. cout << "乘法的结果是:" << s_mul << endl;
  161. vector <int> v_dev = Dev(v1, v2);
  162. string s_dev = VzhuanF(v_dev);
  163. cout << "除法的结果是:" << s_dev << endl;
  164. }
  165. return 0;
  166. }

注意: 博主这里只实现了最简单的算术,还有很多未考虑到的情况,这只是我的一个思路,大家可以将负数的符号及运算的符号也都存在数组中,最后再输出实现的会更完整一些。

博主完善之后会继续更新的,记得关注哦~

发表评论

表情:
评论列表 (有 0 条评论,293人围观)

还没有评论,来说两句吧...

相关阅读

    相关 有理数四则运算

    本题要求编写程序,计算 2 个有理数的和、差、积、商。 输入格式: 输入在一行中按照 a1/b1 a2/b2 的格式给出两个分数形式的有理数,其中分子和分母全是整型范围