有理数四则运算 PTA1034
2024-10-21 13:36:53
题目:https://pintia.cn/problem-sets/994805260223102976/problems/994805287624491008
本题要求编写程序,计算 2 个有理数的和、差、积、商。
输入格式:
输入在一行中按照 a1/b1 a2/b2
的格式给出两个分数形式的有理数,其中分子和分母全是整型范围内的整数,负号只可能出现在分子前,分母不为 0。
输出格式:
分别在 4 行中按照 有理数1 运算符 有理数2 = 结果
的格式顺序输出 2 个有理数的和、差、积、商。注意输出的每个有理数必须是该有理数的最简形式 k a/b
,其中 k
是整数部分,a/b
是最简分数部分;若为负数,则须加括号;若除法分母为 0,则输出 Inf
。题目保证正确的输出中没有超过整型范围的整数。
输入样例 1:
2/3 -4/2
输出样例 1:
2/3 + (-2) = (-1 1/3)
2/3 - (-2) = 2 2/3
2/3 * (-2) = (-1 1/3)
2/3 / (-2) = (-1/3)
输入样例 2:
5/3 0/6
输出样例 2:
1 2/3 + 0 = 1 2/3
1 2/3 - 0 = 1 2/3
1 2/3 * 0 = 0
1 2/3 / 0 = Inf
题解:我碰到的都是一些什么神仙题啊,本题的关键就是对分子分母的处理,计算没什么难度,我用%64d输出输出一直错误,调了一下午,怪我喽!
还有pta里面好像不能用abs()函数,会有浮点错误。
代码:
1 #include <map>
2 #include <stack>
3 #include <queue>
4 #include <cmath>
5 #include <string>
6 #include <limits>
7 #include <cstdio>
8 #include <vector>
9 #include <cstdlib>
10 #include <cstring>
11 #include <iostream>
12 #include <algorithm>
13 #define Scc(c) scanf("%c",&c)
14 #define Scs(s) scanf("%s",s)
15 #define Sci(x) scanf("%d",&x)
16 #define Sci2(x, y) scanf("%d%d",&x,&y)
17 #define Sci3(x, y, z) scanf("%d%d%d",&x,&y,&z)
18 #define Scl(x) scanf("%I64d",&x)
19 #define Scl2(x, y) scanf("%I64d%I64d",&x,&y)
20 #define Scl3(x, y, z) scanf("%I64d%I64d%I64d",&x,&y,&z)
21 #define Pri(x) printf("%d\n",x)
22 #define Prl(x) printf("%I64d\n",x)
23 #define Prc(c) printf("%c\n",c)
24 #define Prs(s) printf("%s\n",s)
25 #define For(i,x,y) for(int i=x;i<y;i++)
26 #define For_(i,x,y) for(int i=x;i<=y;i++)
27 #define FFor(i,x,y) for(int i=x;i>y;i--)
28 #define FFor_(i,x,y) for(int i=x;i>=y;i--)
29 #define Mem(f, x) memset(f,x,sizeof(f))
30 #define LL long long
31 #define ULL unsigned long long
32 #define MAXSIZE 100005
33 #define INF 0x3f3f3f3f
34
35 const int mod=1e9+7;
36 const double PI = acos(-1.0);
37
38 using namespace std;
39 LL GCD(LL a,LL b)
40 {
41 return b==0?a:GCD(b,a%b) ;
42 }
43 LL abss(LL a)
44 {
45 if(a<0)
46 return a*(-1);
47 return a;
48 }
49 void check(LL a,LL b)
50 {
51
52 if(b==0)
53 {
54 printf("Inf");
55 return ;
56 }
57 else if(a==0)
58 {
59 printf("0");
60 return ;
61 }
62 LL t=GCD(abss(a),abss(b));
63 a=a/t;
64 b=b/t;
65 LL tmp=a/b;
66 if(a*b<0)//判断a 、b是异号还是同号
67 {
68 printf("(");
69 if(tmp!=0)
70 {
71 printf("%lld",tmp);
72 if(abss(a)!=abss(tmp*b))
73 printf(" %lld/%lld",abss(a)-abss(tmp*b),abss(b));
74 }
75 else
76 {
77 printf("-%lld/%lld",abss(a),abss(b));
78 }
79 printf(")");
80 }
81 else if(a*b>0)
82 {
83 if(tmp!=0)
84 {
85 printf("%lld",tmp);
86 if(abss(a)-abss(tmp*b)!=0)
87 printf(" %lld/%lld",abss(a)-abss(tmp*b),abss(b));
88 }
89 else
90 printf("%lld/%lld",abss(a),abss(b));
91 }
92 }
93 int main()
94 {
95 LL a,b,c,d;
96 scanf("%lld/%lld",&a,&b);
97 scanf("%lld/%lld",&c,&d);
98 LL x,y;
99 x=a*d+b*c,y=b*d;
100 check(a,b);
101 printf(" + ");
102 check(c,d);
103 printf(" = ");
104 check(x,y);
105 Prs("");
106 x=a*d-b*c,y=b*d;
107 check(a,b);
108 printf(" - ");
109 check(c,d);
110 printf(" = ");
111 check(x,y);
112 Prs("");
113 x=a*c;
114 y=b*d;
115 check(a,b);
116 printf(" * ");
117 check(c,d);
118 printf(" = ");
119 check(x,y);
120 Prs("");
121 x=a*d;
122 y=c*b;
123 check(a,b);
124 printf(" / ");
125 check(c,d);
126 printf(" = ");
127 check(x,y);
128 Prs("");
129 return 0;
130 }
最新文章
- Jquery 获得当前标签的名称和标签属性
- C#3
- C Shell 中的特殊变量
- JNA使用
- IIS启用.net2.0
- C# 刷票程序
- 如何实现Azure虚拟网络中点到站VPN的自动重连
- docker学习笔记(1)
- Android全局异常捕捉
- Markdown内嵌Html语言
- Redis实战 - 4.Key
- spring boot使用TestRestTemplate集成测试 RESTful 接口
- PMM安装-第一篇
- ios隐藏头部状态栏级tableview头部控件
- Android逆向 Android平台虚拟机
- pythonGUI编程-tkinter
- linuxbash 父进程 子进程
- java中常用Redis操作
- 【Android】16.3 带Intent过滤器的Services
- Hive常见问题汇总
热门文章
- js 传递路径参数到后台的转码和解码
- day41 6-1 安装配置maven &; 6-2 创建maven项目 &; 6-3 搭建springMVC框架 &; 6-4 springMVC常用注解和封装工作单元
- 《不一般的 DFT》阅读随笔
- Nginx 安装篇-yum安装
- 结合RocketMQ 源码,带你了解并发编程的三大神器
- 在OpenEuler22.09(也适用于CentOS7+)编译安装Python3.9,并于原Python共存-指南
- C#深拷贝方法
- week_5
- 一篇文章带你了解设计模式原理——UML图和软件设计原则
- [深度学习] ubuntu18.04配置深度学习环境笔记