PAT B1034 有理数四则运算 (20 分)
本题要求编写程序,计算 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
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <string>
#include <map>
using namespace std;
const int maxn = ;
struct num{
long long k = ;
long long up;
long long down;
};
int gcd(long long a, long long b){
return b == ? a : gcd(b, a % b);
}
num add(num n1, num n2){
num res;
res.down = n1.down*n2.down;
res.up = n1.down*n2.up + n1.up*n2.down;
return res;
}
num sub(num n1, num n2){
num res;
res.down = n1.down*n2.down;
res.up = n2.down*n1.up - n2.up*n1.down;
return res;
}
num mul(num n1, num n2){
num res;
res.down = n1.down*n2.down;
res.up = n1.up*n2.up;
return res;
}
num dive(num n1, num n2){
num res;
res.down = n1.down*n2.up;
res.up = n1.up*n2.down;
if (res.down < ){
res.down = - * res.down;
res.up = - * res.up;
}
return res;
}
void clean(num n){
int flag = ;
n.k = n.up / n.down;
if (n.up < ){
n.up = -n.up;
flag = ;
}
n.up = n.up%n.down;
int g = abs(gcd(n.up, n.down));
n.up /= g;
n.down /= g;
if (flag == ){
printf("(");
}
if (n.k != ){
printf("%lld", n.k);
if (n.up != ){
printf(" %lld/%lld", n.up, n.down);
}
}
else{
if (n.up != ){
if (flag == )printf("-");
printf("%lld/%lld", n.up, n.down);
}
else{
printf("");
}
}
if (flag == ){
printf(")");
} }
int main(){
num n1, n2;
scanf("%lld/%lld %lld/%lld", &n1.up, &n1.down, &n2.up, &n2.down);
/*int g = abs(gcd(n1.up, n1.down));
n1.up /= g;
n1.down /= g;
g = abs(gcd(n2.up, n2.down));
n2.up /= g;
n2.down /= g;*/
num q, w, e, r;
q = add(n1, n2);
clean(n1);
printf(" + ");
clean(n2);
printf(" = ");
clean(q);
printf("\n"); w = sub(n1, n2);
clean(n1);
printf(" - ");
clean(n2);
printf(" = ");
clean(w);
printf("\n"); r = mul(n1, n2);
clean(n1);
printf(" * ");
clean(n2);
printf(" = ");
clean(r);
printf("\n"); if (n2.up != ){
e = dive(n1, n2);
clean(n1);
printf(" / ");
clean(n2);
printf(" = ");
clean(e);
printf("\n");
}
else{
clean(n1);
printf(" / ");
clean(n2);
printf(" = Inf\n"); } system("pause");
}
注意点:这道题的坑有两个,一个是int不够大,两个大int乘起来就爆了,要用long long,long long 的输入输出要用lld。第二个是约分,求最大公约数,遍历就超时了,要用辗转相除法,一定要记住!!!
PAT B1034 有理数四则运算 (20 分)的更多相关文章
- PAT1034 有理数四则运算 (20分)
1034 有理数四则运算 (20分) 本题要求编写程序,计算 2 个有理数的和.差.积.商. 输入格式: 输入在一行中按照 a1/b1 a2/b2 的格式给出两个分数形式的有理数,其中分子和分母全 ...
- PAT 1034 有理数四则运算(20)(代码框架+思路+测试点错误分析)
1034 有理数四则运算(20)(20 分)提问 本题要求编写程序,计算2个有理数的和.差.积.商. 输入格式: 输入在一行中按照"a1/b1 a2/b2"的格式给出两个分数形式的 ...
- 1034 有理数四则运算 (20 分)C语言
题目描述 本题要求编写程序,计算2个有理数的和.差.积.商. 输入描述: 输入在一行中按照"a1/b1 a2/b2"的格式给出两个分数形式的有理数,其中分子和分母全是整型范围内的整 ...
- PAT 1034. 有理数四则运算(20)
本题要求编写程序,计算2个有理数的和.差.积.商. 输入格式: 输入在一行中按照"a1/b1 a2/b2"的格式给出两个分数形式的有理数,其中分子和分母全是整型范围内的整数,负号只 ...
- PAT (Basic Level) Practise (中文)-1034. 有理数四则运算(20)
PAT (Basic Level) Practise (中文)-1034. 有理数四则运算(20) http://www.patest.cn/contests/pat-b-practise/1034 ...
- PAT-乙级-1034. 有理数四则运算(20)
1034. 有理数四则运算(20) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 本题要求编写程序,计算2个有理 ...
- PAT Basic 1034 有理数四则运算(20) [数学问题-分数的四则运算]
题目 本题要求编写程序,计算2个有理数的和.差.积.商. 输⼊格式: 输⼊在⼀⾏中按照"a1/b1 a2/b2"的格式给出两个分数形式的有理数,其中分⼦和分⺟全是整型范围内的整数, ...
- 【算法笔记】B1034 有理数四则运算
1034 有理数四则运算 (20 分) 本题要求编写程序,计算 2 个有理数的和.差.积.商. 输入格式: 输入在一行中按照 a1/b1 a2/b2 的格式给出两个分数形式的有理数,其中分子和分母 ...
- pat 1035 Password(20 分)
1035 Password(20 分) To prepare for PAT, the judge sometimes has to generate random passwords for the ...
随机推荐
- gradle tool升级到3.0注意事项
Gradle版本升级 其实当AS升级到3.0之后,Gradle Plugin和Gradle不升级也是可以继续使用的,但很多新的特性如:Java8支持.新的依赖匹配机制.AAPT2等新功能都无法正常使用 ...
- Java_万年历(简单)
1.方法,需要一个年份,一个月份.然后在控制台输出日历 // 输入一个年份和一个月份显示日历 public static void printCalendar(int year, int month) ...
- javax.net.ssl.SSLHandshakeException sun.security.validator.ValidatorException PK
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building f ...
- 从零开始学习html(十二)CSS布局模型——上
一.css布局模型 清楚了CSS 盒模型的基本概念. 盒模型类型, 我们就可以深入探讨网页布局的基本模型了. 布局模型与盒模型一样都是 CSS 最基本. 最核心的概念. 但布局模型是建立在盒模型基础之 ...
- CSS中的三种常用定位
一.相对定位(position:relative) 如果想让一个元素在本来的位置进行一个位移,可以将该元素的定位设置为relative,同时指定相对位移(利用top,bottom,left,right ...
- ISDBT中CC的处理疑问
一个针对日本的数字电视应用(ISDBT)里字幕处理有一些问题,规范文档庞大又复杂,读起来还觉得语焉不详.接手遗留项目尝试处理字幕显示的问题,边读spec边看代码,先猜测.试图理解既有逻辑,再分析问题产 ...
- 如何为APK签名?
1.用来生成应用签名的文件 ①默认: debug.keystore > debug签名的应用程序不能在Android Market上架销售,它会强制你使用自己的签名.> 不同电脑使用此 ...
- 利用ListView批量删除item
利用CheckBox选中一个或多个item,最后批量删除它们. 程序运行效果图如下: package com.test.adapter; import java.util.ArrayList; imp ...
- 使用Webpack对Css文件压缩处理的思考
问题的起因: 使用 bulma.css ,通过webpack打包后样式出错,查看压缩代码,发现代码从css的 long hand 属性被压缩为 short hand(PS: 什么是long hand ...
- CSS3动画详解(图文教程)
本文最初发表于博客园,并在GitHub上持续更新前端的系列文章.欢迎在GitHub上关注我,一起入门和进阶前端. 以下是正文. 前言 本文主要内容: 过渡:transition 2D 转换 trans ...