PAT (Basic Level) Practise (中文)-1034. 有理数四则运算(20)
PAT (Basic Level) Practise (中文)-1034. 有理数四则运算(20) http://www.patest.cn/contests/pat-b-practise/1034
本题要求编写程序,计算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 分析:本题目没有思维的难度,只是可能处理起来有点啰嗦烦人,所以建议一定要单独写成小功能函数。
比如:
1. 输出的每个有理数必须是该有理数的最简形式“k a/b”,其中k是整数部分,a/b是最简分数部分
2. 若为负数,则须加括号
3. 若除法分母为0,则输出“Inf”。
#include<stdio.h>
void jianhua(long long *fenzi,long long *fenmu)
{
if(*fenzi== || *fenmu==)
{
*fenzi=,*fenmu=;
return;
}
int flag1=,flag2= ;// 1负数 2正数
if(*fenzi<) flag1=,*fenzi=-*fenzi;
if(*fenmu<) flag2=,*fenmu=-*fenmu;
long long max=,min=;
if(*fenzi>*fenmu) max=*fenzi,min=*fenmu;
else min=*fenzi,max=*fenmu;
while(max%min)
{
if(max-min>min)
max=max-min;
else
{
min=max-min;
max=max-min;
}
}
*fenzi/=min,*fenmu/=min;
if(flag1) *fenzi=-*fenzi;
if(flag2) *fenmu=-*fenmu;
if(*fenmu<) *fenzi=-*fenzi,*fenmu=-*fenmu;
return;
}
void outlook(long long a,long long b,int i,long long c) //输出 函数
{
int flag=;
if(a<) {flag=;a=-a;printf("(-");}
if(i== && c==) printf("Inf"); //i==3时代表除法运算
else if(a==) printf(""); //分子为0,即数==0
else if(a/b) { if(a%b) printf("%lld %lld/%lld",a/b,a%b,b);
else printf("%lld",a/b);
}else printf("%lld/%lld",a,b); //可以整除,即简化为整数
if(flag) printf(")");
}
int main()
{
long long *pfenzi=,*pfenmu=;
long long a=,b=,c=,d=,fenzi=,fenmu=; //因为两个整数相乘,可能超出int范围,所以使用了long long
scanf("%lld/%lld %lld/%lld",&a,&b,&c,&d);
pfenzi=&a;
pfenmu=&b;
jianhua(pfenzi,pfenmu); //第一个数
pfenzi=&c;
pfenmu=&d;
jianhua(pfenzi,pfenmu); //第二个数
char op[]={'+','-','*','/'};
for(int i=;i<;i++)
{
//'+','-','*','/' 依次处理
if(==i) { fenzi=a*d+c*b; fenmu=b*d; }
else if(==i) { fenzi=a*d-c*b; fenmu=b*d; }
else if(==i) { fenzi=a*c; fenmu=b*d; }
else { fenzi=a*d; fenmu=b*c; }
pfenzi=&fenzi;
pfenmu=&fenmu;
jianhua(pfenzi,pfenmu); // 简化当前处理运算的结果
// 格式输出
if(i) printf("\n");
outlook(a,b,i,); //第一个数
printf(" %c ",op[i]); // 运算符
outlook(c,d,i,); //第二个数
printf(" = ");
outlook(fenzi,fenmu,i,c); //结果
}
return ;
}
好讨厌这道题。。。难度不高,却这么复杂。。。好考验耐心。。。
PAT (Basic Level) Practise (中文)-1034. 有理数四则运算(20)的更多相关文章
- PAT (Basic Level) Practise (中文)-1039. 到底买不买(20)
PAT (Basic Level) Practise (中文)-1039. 到底买不买(20) http://www.patest.cn/contests/pat-b-practise/1039 小红 ...
- PAT (Basic Level) Practise (中文)- 1022. D进制的A+B (20)
PAT (Basic Level) Practise (中文)- 1022. D进制的A+B (20) http://www.patest.cn/contests/pat-b-practise/1 ...
- PAT (Basic Level) Practise (中文)- 1024. 科学计数法 (20)
PAT (Basic Level) Practise (中文)- 1024. 科学计数法 (20) http://www.patest.cn/contests/pat-b-practise/1024 ...
- PAT (Basic Level) Practise (中文)-1025. 反转链表 (25)
PAT (Basic Level) Practise (中文)-1025. 反转链表 (25) http://www.patest.cn/contests/pat-b-practise/1025 ...
- PAT (Basic Level) Practise (中文)- 1026. 程序运行时间(15)
PAT (Basic Level) Practise (中文)- 1026. 程序运行时间(15) http://www.patest.cn/contests/pat-b-practise/10 ...
- PAT (Basic Level) Practise (中文)-1027. 打印沙漏(20)
PAT (Basic Level) Practise (中文)-1027. 打印沙漏(20) http://www.patest.cn/contests/pat-b-practise/1027 本题 ...
- PAT (Basic Level) Practise (中文)-1028. 人口普查(20)
PAT (Basic Level) Practise (中文)-1028. 人口普查(20) http://www.patest.cn/contests/pat-b-practise/1028 某 ...
- PAT (Basic Level) Practise (中文)-1029. 旧键盘(20)
PAT (Basic Level) Practise (中文)-1029. 旧键盘(20) http://www.patest.cn/contests/pat-b-practise/1029 旧键盘上 ...
- PAT (Basic Level) Practise (中文)-1030. 完美数列(25)
PAT (Basic Level) Practise (中文)-1030. 完美数列(25) http://www.patest.cn/contests/pat-b-practise/1030 给 ...
随机推荐
- 自定义Mybatis返回类型及注意事项
一.自定义返回拦截器package com.yaoex.crm.service.util; import org.apache.ibatis.session.ResultContext;import ...
- Codevs 1140 Jam的计数法
1140 Jam的计数法 题目描述 Description Jam是个喜欢标新立异的科学怪人.他不使用阿拉伯数字计数,而是使用小写英文字母计数,他觉得这样做,会使世界更加丰富多彩.在他的计数法中,每个 ...
- Withdraw From OI
Withdraw From OI 已经退役一周了,但还是迟迟没有去写退役记,在这个2017年的最后一天,写下这一篇沉重的“withdraw from OI”. 距离联赛成绩出来已经一个多月了.这一个月 ...
- 【渗透测试】如何使用burpsuite对特殊密码进行爆破
爆破是渗透测试中必不可少的一部分,对于没有太大价值可利用的漏洞或是业务只有一个登陆页面时,爆破更是我们的最合适的选择.那么在爆破时,抛去目标系统对爆破频率的限制,如果遇到较为复杂的密码,该如何顺利进行 ...
- PHP保留小数的相关方法
结合一下网上的例子 $num = 10.4567; //第一种:利用round()对浮点数进行四舍五入 但是这个如果没有两位小数也不会"两位精度" echo round($num, ...
- struts2学习笔记 day02 获取参数 访问ServletAPI 结果类型
- Mysql 开启 Slow 慢查询
1:登录数据库查看是否已经开启了Slow慢查询: mysql> show variables like 'slow_query%'; 2:开启Mysql slow日志: 默认情况下slow_qu ...
- JMETER通过java代码通过代码/ JMETER API实现示例进行负载测试
本教程试图解释Jmeter的基本设计,功能和用法,Jmeter是用于在应用程序上执行负载测试的优秀工具.通过使用jmeter GUI,我们可以根据我们的要求为请求创建测试样本并执行具有多个用户负载的样 ...
- nginx,tomcat,apache三者分别用来做什么,有何区别
1. Nginx和tomcat的区别 nginx常用做静态内容服务和代理服务器,直接外来请求转发给后面的应用服务器(tomcat,Django等),tomcat更多用来做一个应用容器,让java we ...
- [洛谷3935]Calculating
题目链接:https://www.luogu.org/problemnew/show/P3935 首先显然有\(\sum\limits_{i=l}^rf(i)=\sum\limits_{i=1}^rf ...