PAT乙级1034

今天药忘吃喽~ 2022-05-09 02:33 286阅读 0赞

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

本题要求编写程序,计算 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
  5. #include<iostream>
  6. #include<cstdio>
  7. #include<sstream>
  8. #include<string>
  9. #include<cmath>
  10. using namespace std;
  11. int quyu(long long a,long long b){
  12. if(b==0)
  13. return abs(a);//返回a的绝对值
  14. quyu(b,a%b);
  15. }//求最大公因数
  16. string chan(long a,long b){
  17. string s;
  18. if(a==0)
  19. return "0";//如果分子为0,则返回数组0
  20. long yu=quyu(a,b);//求最大公因
  21. a/=yu;
  22. b/=yu;//化简到最简
  23. stringstream ss;
  24. int flag=1;
  25. if(a<0){
  26. flag=-1;
  27. a=-a;
  28. ss<<"(-";
  29. }//如果小于0输出负号
  30. long inte=a/b;
  31. long a0=a%b;
  32. if(inte!=0){
  33. ss<<inte;
  34. }//输出整数
  35. if(a0!=0){
  36. if(inte!=0)
  37. ss<<' ';
  38. ss<<a0;
  39. ss<<'/';
  40. ss<<b;
  41. }//输出分数
  42. if(flag==-1){
  43. ss<<")";
  44. }//如果是负数,输出括号
  45. getline(ss,s);//getline()函数用于读取文本中的一行内容
  46. return s;
  47. }
  48. int main()
  49. {
  50. long long a1,b1,a2,b2;//核心,以后没给取值范围的,全都写long long
  51. scanf("%lld/%lld%lld/%lld",&a1,&b1,&a2,&b2);//%ll为long long型输入
  52. string s1,s2;
  53. long long yu;
  54. if(a1!=0){
  55. yu=quyu(a1,b1);
  56. a1/=yu;
  57. b1/=yu;
  58. }//化简第一个数组
  59. if(a2!=0){
  60. yu=quyu(a2,b2);
  61. a2/=yu;
  62. b2/=yu;
  63. }//化简第二个数组
  64. s1=chan(a1,b1);
  65. s2=chan(a2,b2);
  66. string s3;
  67. long long a3,b3;
  68. a3=a1*b2+a2*b1;
  69. b3=b1*b2;
  70. s3=chan(a3,b3);
  71. cout<<s1<<" + "<<s2<<" = "<<s3<<endl;
  72. a3=a1*b2-a2*b1;
  73. b3=b1*b2;
  74. s3=chan(a3,b3);
  75. cout<<s1<<" - "<<s2<<" = "<<s3<<endl;
  76. a3=a1*a2;
  77. b3=b1*b2;
  78. s3=chan(a3,b3);
  79. cout<<s1<<" * "<<s2<<" = "<<s3<<endl;
  80. a3=a1*b2;
  81. b3=b1*a2;
  82. if(b3<0){
  83. a3=-a3;
  84. b3=-b3;
  85. }
  86. if(b3==0){
  87. cout<<s1<<" / "<<s2<<" = Inf"<<endl;
  88. }else{
  89. s3=chan(a3,b3);
  90. cout<<s1<<" / "<<s2<<" = "<<s3<<endl;
  91. }
  92. return 0;
  93. }

发表评论

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

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

相关阅读

    相关 PAT乙级1004

    1004 成绩排名 (20)(20 分) 读入n名学生的姓名、学号、成绩,分别输出成绩最高和成绩最低学生的姓名和学号。 输入格式:每个测试输入包含1个测试用例,格式为\\

    相关 PAT乙级1003

    1003 我要通过!(20)(20 分) “答案正确”是自动判题系统给出的最令人欢喜的回复。本题属于PAT的“答案正确”大派送 —— 只要读入的字符串满足下列条件,系统就输出

    相关 PAT乙级1013

    1013 数素数(20 分) 令 Pi 表示第 i 个素数。现任给两个正整数 M≤N≤104,请输出 PM 到 PN 的所有素数。 输入格式: 输入在一行中给出 M

    相关 PAT乙级1031

    1031 查验身份证 (15 分) 一个合法的身份证号码由17位地区、日期编号和顺序编号加1位校验码组成。校验码的计算规则如下: 首先对前17位数字加权求和,权重分配为:\

    相关 PAT乙级1034

    1034 有理数四则运算 (20 分) 本题要求编写程序,计算 2 个有理数的和、差、积、商。 输入格式: 输入在一行中按照 `a1/b1 a2/b2` 的格式给出两

    相关 PAT乙级1044

    1044 火星数字 (20 分) 火星人是以 13 进制计数的: 地球人的 0 被火星人称为 tret。 地球人数字 1 到 12 的火星文分别为:jan, f