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 ...
随机推荐
- 走通Django的基本流程
工程目录及文件的说明 manage.py:一个命令行工具,可以使我们用多种方式对Django项目进行交互 __init__.py:一个空文件,它告诉Python这个文件的上级目录应该看做一个pytho ...
- 【读书笔记】iOS-网络-异步请求与运行循环
异步请求需要运行循环.当数据传递到服务器或是被客户端接收时,运行循环用于实现事件与委托对象之间的通信.异步请求在发出时,会在当前线程的运行循环上操作,这个实现细节是很重要的,因为在GCD块中或者是通过 ...
- js之面向对象
本文的面向对象分为ES6和ES6之前的,重点学习ES6的===============================一.面向对象 1.什么是面向对象 a)什么是对象:万物都可以抽象成对象 时间对象 ...
- Android逆向 APK文件组成
一 了解APK文件 我们知道Android系统能运行的程序是.apk文件格式,其实它就是一个压缩包而已,把.apk修改成.zip,然后解压就可以得到该apk内部的文件结构. PS: 既然可以把apk文 ...
- Linux —— Vi 命令介绍
简介 vi编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器. 这里只是简单地介绍一下它的用法和一小部分指令. 由于对Unix及Linux系统的任何版本,vi编辑 ...
- 负载均衡(Load Balancing)学习笔记(一)
概述 在分布式系统中,负载均衡(Load Balancing)是一种将任务分派到多个服务端进程的方法.例如,将一个HTTP请求派发到实际的Web服务器中执行的过程就涉及负载均衡的实现.一个HTTP请求 ...
- Chained Declustering
此论文描述了在无共享架构的多处理器机器上的数据库系统的数据冗余分布方法.该方法提高了系统的可用性,同时在单节点故障的情况下,可以很好的实现负载均衡.以下是论文的一些摘要,详细可以参见论文原 ...
- Oracle EBS OPM update material txn
--update_material_txn --created by jenrry DECLARE p_mmti_rec mtl_transactions_interface%ROWTYPE; p_m ...
- C# 字符串的操作
var tStr = "0|1:开门|2:关门|3:门检失败|4:开门|5:开门|6:关门"; ).Split(], s.Split(]).Replace(").Repl ...
- html基础笔记-表单、链接
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <!-- 字符编码U ...