题目:https://pintia.cn/problem-sets/994805260223102976/problems/994805287624491008

注意点

有个地方我一开始没注意,导致分子和分母的正负一直有问题
就是求最大公约数的d时,gcd里面要传绝对值,一定要注意约数的求法!!

  1. Fraction reduction(Fraction a){
  2. if(a.down < 0){
  3. a.up *= -1;
  4. a.down *= -1;
  5. }
  6. if(a.up == 0) a.down = 1;
  7. else {
  8. ll d = gcd(abs(a.up), abs(a.down));
  9. a.up /= d;
  10. a.down /= d;
  11. }
  12. return a;
  13. }

代码

  1. #include<algorithm>
  2. #include<vector>
  3. #include<iostream>
  4. #include<cstdio>
  5. using namespace std;
  6. typedef long long ll;
  7. struct Fraction{
  8. ll up, down;
  9. };
  10. ll gcd(ll a, ll b){
  11. return b == 0 ? a : gcd(b, a % b);
  12. }
  13. Fraction reduction(Fraction a){
  14. if(a.down < 0){
  15. a.up *= -1;
  16. a.down *= -1;
  17. }
  18. if(a.up == 0) a.down = 1;
  19. else {
  20. ll d = gcd(abs(a.up), abs(a.down));
  21. a.up /= d;
  22. a.down /= d;
  23. }
  24. return a;
  25. }
  26. Fraction add(Fraction a, Fraction b){
  27. Fraction temp;
  28. temp.up = a.up * b.down + b.up * a.down;
  29. temp.down = a.down * b.down;
  30. return reduction(temp);
  31. }
  32. Fraction minu(Fraction a, Fraction b){
  33. Fraction temp;
  34. temp.up = a.up * b.down - b.up * a.down;
  35. temp.down = a.down * b.down;
  36. return reduction(temp);
  37. }
  38. Fraction multiply(Fraction a, Fraction b){
  39. Fraction temp;
  40. temp.up = a.up * b.up;
  41. temp.down = a.down * b.down;
  42. return reduction(temp);
  43. }
  44. Fraction divide(Fraction a, Fraction b){
  45. Fraction temp;
  46. temp.up = a.up * b.down;
  47. temp.down = a.down * b.up;
  48. return reduction(temp);
  49. }
  50. void show_Fra(Fraction a){
  51. a = reduction(a);
  52. if(a.up < 0) printf("(");
  53. if(a.down == 1) printf("%lld",a.up);
  54. else if(abs(a.up) > a.down) printf("%lld %lld/%lld",a.up / a.down, abs(a.up) % a.down, a.down);
  55. else printf("%lld/%lld", a.up, a.down);
  56. if(a.up < 0) printf(")");
  57. }
  58. int main(){
  59. Fraction a, b;
  60. scanf("%lld/%lld %lld/%lld", &a.up, &a.down, &b.up, &b.down);
  61. show_Fra(a);
  62. printf(" + ");
  63. show_Fra(b);
  64. printf(" = ");
  65. show_Fra(add(a, b));
  66. printf("\n");
  67. show_Fra(a);
  68. printf(" - ");
  69. show_Fra(b);
  70. printf(" = ");
  71. show_Fra(minu(a, b));
  72. printf("\n");
  73. show_Fra(a);
  74. printf(" * ");
  75. show_Fra(b);
  76. printf(" = ");
  77. show_Fra(multiply(a, b));
  78. printf("\n");
  79. show_Fra(a);
  80. printf(" / ");
  81. show_Fra(b);
  82. printf(" = ");
  83. if(b.up != 0) show_Fra(divide(a, b));
  84. else printf("Inf");
  85. printf("\n");
  86. }