1034. 有理数四则运算(20)

傷城~ 2022-05-26 06:22 306阅读 0赞

本题要求编写程序,计算2个有理数的和、差、积、商。

输入格式:

输入在一行中按照“a1/b1 a2/b2”的格式给出两个分数形式的有理数,其中分子和分母全是整型范围内的整数,负号只可能出现在分子前,分母不为0。

输出格式:

分别在4行中按照“有理数1 运算符 有理数2 = 结果”的格式顺序输出2个有理数的和、差、积、商。注意输出的每个有理数必须是该有理数的最简形式“k a/b”,其中k是整数部分,a/b是最简分数部分;若为负数,则须加括号;若除法分母为0,则输出“Inf”。题目保证正确的输出中没有超过整型范围的整数。

输入样例1:

  1. 2/3 -4/2

输出样例1:

  1. 2/3 + (-2) = (-1 1/3)
  2. 2/3 - (-2) = 2 2/3
  3. 2/3 * (-2) = (-1 1/3)
  4. 2/3 / (-2) = (-1/3)

输入样例2:

  1. 5/3 0/6

输出样例2:

  1. 1 2/3 + 0 = 1 2/3
  2. 1 2/3 - 0 = 1 2/3
  3. 1 2/3 * 0 = 0
  4. 1 2/3 / 0 = Inf

代码:

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. long long a,b,c,a1,b1,c1,a2,c2,b2;
  4. long long gcd(long long a,long long b)
  5. {
  6. if(b==0)
  7. return a;
  8. else
  9. return gcd(b,a%b);
  10. }
  11. void output(char s)
  12. {
  13. if(c<0||a<0)
  14. {
  15. printf("(");
  16. }
  17. if(c==0&&a!=0)
  18. {
  19. printf("%lld/%lld",a,b);
  20. }
  21. else if(c!=0&&a==0)
  22. {
  23. printf("%lld",c);
  24. }
  25. else if(c!=0&&a!=0)
  26. {
  27. printf("%lld %lld/%lld",c,a,b);
  28. }
  29. else
  30. {
  31. printf("0");
  32. }
  33. if(c<0||a<0)
  34. {
  35. printf(")");
  36. }
  37. printf(" %c ",s);
  38. if(c1<0||a1<0)
  39. {
  40. printf("(");
  41. }
  42. if(c1==0&&a1!=0)
  43. {
  44. printf("%lld/%lld",a1,b1);
  45. }
  46. else if(c1!=0&&a1==0)
  47. {
  48. printf("%lld",c1);
  49. }
  50. else if(c1!=0&&a1!=0)
  51. {
  52. printf("%lld %lld/%lld",c1,a1,b1);
  53. }
  54. else
  55. {
  56. printf("0");
  57. }
  58. if(c1<0||a1<0)
  59. {
  60. printf(")");
  61. }
  62. printf(" = ");
  63. if(s=='/'&&c1==0&&a1==0)
  64. {
  65. if(a==0&&c==0)
  66. printf("0");
  67. else
  68. printf("Inf");
  69. return ;
  70. }
  71. if(c2<0||a2<0)
  72. {
  73. printf("(");
  74. }
  75. if(c2==0&&a2!=0)
  76. {
  77. printf("%lld/%lld",a2,b2);
  78. }
  79. else if(c2!=0&&a2==0)
  80. {
  81. printf("%lld",c2);
  82. }
  83. else if(c2!=0&&a2!=0)
  84. {
  85. printf("%lld %lld/%lld",c2,a2,b2);
  86. }
  87. else
  88. {
  89. printf("0");
  90. }
  91. if(c2<0||a2<0)
  92. {
  93. printf(")");
  94. }
  95. printf("\n");
  96. }
  97. void change()
  98. {
  99. c=a/b;
  100. if(c==0)
  101. a=a%b;
  102. else
  103. a=llabs(a)%b;
  104. long long tmp=gcd(llabs(a),b);
  105. a=a/tmp;
  106. b=b/tmp;
  107. c1=a1/b1;
  108. if(c1==0)
  109. a1=a1%b1;
  110. else
  111. a1=llabs(a1)%b1;
  112. tmp=gcd(llabs(a1),b1);
  113. a1=a1/tmp;
  114. b1=b1/tmp;
  115. //printf("%lld %lld\n",a1,b1);
  116. }
  117. void add()
  118. {
  119. if(c<0)
  120. a2=(c*b-a)*b1;
  121. else
  122. a2=(c*b+a)*b1;
  123. if(c1<0)
  124. a2+=(c1*b1-a1)*b;
  125. else
  126. a2+=(c1*b1+a1)*b;
  127. b2=b*b1;
  128. long long tmp=gcd(llabs(a2),b2);
  129. a2=a2/tmp;
  130. b2=b2/tmp;
  131. c2=a2/b2;
  132. if(c2==0)
  133. a2=a2%b2;
  134. else
  135. a2=llabs(a2)%b2;
  136. output('+');
  137. }
  138. void minus()
  139. {
  140. if(c<0)
  141. a2=(c*b-a)*b1;
  142. else
  143. a2=(c*b+a)*b1;
  144. if(c1<0)
  145. a2-=(c1*b1-a1)*b;
  146. else
  147. a2-=(c1*b1+a1)*b;
  148. b2=b*b1;
  149. long long tmp=gcd(llabs(a2),b2);
  150. a2=a2/tmp;
  151. b2=b2/tmp;
  152. c2=a2/b2;
  153. if(c2==0)
  154. a2=a2%b2;
  155. else
  156. a2=llabs(a2)%b2;
  157. output('-');
  158. }
  159. void multiply()
  160. {
  161. if(c<0)
  162. a2=(c*b-a);
  163. else
  164. a2=(c*b+a);
  165. if(c1<0)
  166. a2*=(c1*b1-a1);
  167. else
  168. a2*=(c1*b1+a1);
  169. b2=b*b1;
  170. long long tmp=gcd(llabs(a2),b2);
  171. a2=a2/tmp;
  172. b2=b2/tmp;
  173. c2=a2/b2;
  174. if(c2==0)
  175. a2=a2%b2;
  176. else
  177. a2=llabs(a2)%b2;
  178. output('*');
  179. }
  180. void divide()
  181. {
  182. if(c1==0&&a1==0)
  183. output('/');
  184. else
  185. {
  186. if(c<0)
  187. a2=(c*b-a);
  188. else
  189. a2=(c*b+a);
  190. a2*=b1;
  191. if(c1<0)
  192. b2=(c1*b1-a1);
  193. else
  194. b2=(c1*b1+a1);
  195. b2*=b;
  196. if(b2<0)
  197. {
  198. a2=-a2;
  199. b2=-b2;
  200. }
  201. long long tmp=gcd(llabs(a2),b2);
  202. a2=a2/tmp;
  203. b2=b2/tmp;
  204. c2=a2/b2;
  205. if(c2==0)
  206. a2=a2%b2;
  207. else
  208. a2=llabs(a2)%b2;
  209. output('/');
  210. }
  211. }
  212. int main()
  213. {
  214. long long i,j,n,m,k,t;
  215. scanf("%lld/%lld %lld/%lld",&a,&b,&a1,&b1);
  216. change();
  217. add();
  218. minus();
  219. multiply();
  220. divide();
  221. return 0;
  222. }

发表评论

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

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

相关阅读

    相关 有理数四则运算

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

    相关 1034. 有理数四则运算(20)

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