本题要求编写程序,计算 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
作者: CHEN, Yue
单位: 浙江大学
时间限制: 200 ms
内存限制: 64 MB
代码长度限制: 16 KB
  1. #include <iostream>
  2. #include <stdio.h>
  3. #include <algorithm>
  4. #include <string>
  5. #include <map>
  6. using namespace std;
  7. const int maxn = ;
  8. struct num{
  9. long long k = ;
  10. long long up;
  11. long long down;
  12. };
  13. int gcd(long long a, long long b){
  14. return b == ? a : gcd(b, a % b);
  15. }
  16. num add(num n1, num n2){
  17. num res;
  18. res.down = n1.down*n2.down;
  19. res.up = n1.down*n2.up + n1.up*n2.down;
  20. return res;
  21. }
  22. num sub(num n1, num n2){
  23. num res;
  24. res.down = n1.down*n2.down;
  25. res.up = n2.down*n1.up - n2.up*n1.down;
  26. return res;
  27. }
  28. num mul(num n1, num n2){
  29. num res;
  30. res.down = n1.down*n2.down;
  31. res.up = n1.up*n2.up;
  32. return res;
  33. }
  34. num dive(num n1, num n2){
  35. num res;
  36. res.down = n1.down*n2.up;
  37. res.up = n1.up*n2.down;
  38. if (res.down < ){
  39. res.down = - * res.down;
  40. res.up = - * res.up;
  41. }
  42. return res;
  43. }
  44. void clean(num n){
  45. int flag = ;
  46. n.k = n.up / n.down;
  47. if (n.up < ){
  48. n.up = -n.up;
  49. flag = ;
  50. }
  51. n.up = n.up%n.down;
  52. int g = abs(gcd(n.up, n.down));
  53. n.up /= g;
  54. n.down /= g;
  55. if (flag == ){
  56. printf("(");
  57. }
  58. if (n.k != ){
  59. printf("%lld", n.k);
  60. if (n.up != ){
  61. printf(" %lld/%lld", n.up, n.down);
  62. }
  63. }
  64. else{
  65. if (n.up != ){
  66. if (flag == )printf("-");
  67. printf("%lld/%lld", n.up, n.down);
  68. }
  69. else{
  70. printf("");
  71. }
  72. }
  73. if (flag == ){
  74. printf(")");
  75. }
  76.  
  77. }
  78. int main(){
  79. num n1, n2;
  80. scanf("%lld/%lld %lld/%lld", &n1.up, &n1.down, &n2.up, &n2.down);
  81. /*int g = abs(gcd(n1.up, n1.down));
  82. n1.up /= g;
  83. n1.down /= g;
  84. g = abs(gcd(n2.up, n2.down));
  85. n2.up /= g;
  86. n2.down /= g;*/
  87. num q, w, e, r;
  88. q = add(n1, n2);
  89. clean(n1);
  90. printf(" + ");
  91. clean(n2);
  92. printf(" = ");
  93. clean(q);
  94. printf("\n");
  95.  
  96. w = sub(n1, n2);
  97. clean(n1);
  98. printf(" - ");
  99. clean(n2);
  100. printf(" = ");
  101. clean(w);
  102. printf("\n");
  103.  
  104. r = mul(n1, n2);
  105. clean(n1);
  106. printf(" * ");
  107. clean(n2);
  108. printf(" = ");
  109. clean(r);
  110. printf("\n");
  111.  
  112. if (n2.up != ){
  113. e = dive(n1, n2);
  114. clean(n1);
  115. printf(" / ");
  116. clean(n2);
  117. printf(" = ");
  118. clean(e);
  119. printf("\n");
  120. }
  121. else{
  122. clean(n1);
  123. printf(" / ");
  124. clean(n2);
  125. printf(" = Inf\n");
  126.  
  127. }
  128.  
  129. system("pause");
  130. }

注意点:这道题的坑有两个,一个是int不够大,两个大int乘起来就爆了,要用long long,long long 的输入输出要用lld。第二个是约分,求最大公约数,遍历就超时了,要用辗转相除法,一定要记住!!!

PAT B1034 有理数四则运算 (20 分)的更多相关文章

  1. PAT1034 有理数四则运算 (20分)

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

  2. PAT 1034 有理数四则运算(20)(代码框架+思路+测试点错误分析)

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

  3. 1034 有理数四则运算 (20 分)C语言

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

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

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

  5. PAT (Basic Level) Practise (中文)-1034. 有理数四则运算(20)

    PAT (Basic Level) Practise (中文)-1034. 有理数四则运算(20)  http://www.patest.cn/contests/pat-b-practise/1034 ...

  6. PAT-乙级-1034. 有理数四则运算(20)

    1034. 有理数四则运算(20) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 本题要求编写程序,计算2个有理 ...

  7. PAT Basic 1034 有理数四则运算(20) [数学问题-分数的四则运算]

    题目 本题要求编写程序,计算2个有理数的和.差.积.商. 输⼊格式: 输⼊在⼀⾏中按照"a1/b1 a2/b2"的格式给出两个分数形式的有理数,其中分⼦和分⺟全是整型范围内的整数, ...

  8. 【算法笔记】B1034 有理数四则运算

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

  9. pat 1035 Password(20 分)

    1035 Password(20 分) To prepare for PAT, the judge sometimes has to generate random passwords for the ...

随机推荐

  1. Codeforces833A

    A. The Meaningless Game time limit per test:1 second memory limit per test:256 megabytes input:stand ...

  2. 【 js 算法类】这么全的数组去重,你怕不怕?

    以 var arr = [1,2,3,1]; 作为测试用例 方法一:双循环   (时间复杂度比较高,性能一般.) A.(1) function unique(arr) { var newArr = [ ...

  3. socket 模拟 HTTP请求

    一.socket介绍 网络由下往上分为物理层.数据链路层.网络层.传输层.会话层.表示层和应用层.IP协议对应于网络层,TCP协议对应于传输层,而HTTP协议对应于应用层.socket则是对TCP/I ...

  4. php递归获取无限分类菜单

    从数据库获取所有菜单信息,需要根据id,pid字段获取主菜单及其子菜单,以及子菜单下的子菜单,可以通过函数递归来实现. <?php class Menu { public $menu = arr ...

  5. Adapter中用不了getWindowManager()

    在写popupwindow的时候一般会获取屏幕的宽高来设置popupwindow的宽高,但是在adapter中用不了getWindowManager(), 但是为什么Activity中就可以用getW ...

  6. 微信小程序开发--宽为百分百,页面仍可左右滑动

    这段时间小程序开发时,很多时候,希望内容充满整个屏幕(高度.宽度100%),如下图 但是在设置 .followrecords-container{width:100%;} 后发现 手机在横向上虽然页面 ...

  7. Python笔记(十三):urllib模块

    (一)      URL地址 URL地址组件 URL组件 说明 scheme 网络协议或下载方案 net_loc 服务器所在地(也许含有用户信息) path 使用(/)分割的文件或CGI应用的路径 p ...

  8. 双启动:安装Windows 7 和 CentOS 7 双系统教程

    笔记本配置:8G内存,200G SSD,先在virbox中成功安装双系统,能正常进入并使用 Windows 7 和 CentOS 7. 网上看到一大堆的安装 wingrub  easyBCD,折腾了一 ...

  9. LeetCode题解之Longest Continuous Increasing Subsequence

    1.题目描述 2.问题分析 从每一个num[i]往前扫描即可. 3.代码 int findLengthOfLCIS(vector<int>& nums) { ){ return n ...

  10. 七牛云A账号数据迁移到B账号下

    1,七牛云A账号下开启空间授权,可以让B账号可以访问A账号下的空间,,授予权限只读即可. 2,下载七牛云命令行工具.(通过命令完成数据迁移) https://dn-devtools.qbox.me/2 ...