首页
学习
活动
专区
圈层
工具
发布
30 篇文章
1
PAT (Basic Level) Practice (中文)1054 求平均值 (20 分)
2
PAT (Basic Level) Practice (中文)1051 复数乘法 (15 分)
3
PAT (Basic Level) Practice (中文)1050 螺旋矩阵 (25 分)
4
PAT (Basic Level) Practice (中文)1046 划拳 (15 分)
5
PAT (Basic Level) Practice (中文)1045 快速排序 (25 分)
6
PAT (Basic Level) Practice (中文)1047 编程团体赛 (20 分)
7
PAT (Basic Level) Practice (中文)1043 输出PATest (20 分)
8
PAT (Basic Level) Practice (中文)1042 字符统计 (20 分)
9
PAT (Basic Level) Practice (中文)1040 有几个PAT (25 分)
10
PAT (Basic Level) Practice (中文)1038 统计同成绩学生 (20 分)
11
PAT (Basic Level) Practice (中文)1036 跟奥巴马一起编程 (15 分)
12
PAT (Basic Level) Practice (中文)1034 有理数四则运算 (20 分)
13
PAT (Basic Level) Practice (中文)1032 挖掘机技术哪家强 (20 分)
14
PAT (Basic Level) Practice (中文)1031 查验身份证 (15 分)
15
PAT (Basic Level) Practice (中文)1030 完美数列 (25 分)
16
PAT (Basic Level) Practice (中文)1029 旧键盘 (20 分)
17
PAT (Basic Level) Practice (中文)1028 人口普查 (20 分)
18
PAT (Basic Level) Practice (中文)1027 打印沙漏 (20 分)
19
PAT (Basic Level) Practice (中文)1025 反转链表 (25 分)
20
PAT (Basic Level) Practice (中文)1053 住房空置率 (20 分)
21
PAT (Basic Level) Practice (中文)1024 科学计数法 (20 分)
22
PAT (Basic Level) Practice (中文)1022 D进制的A+B (20 分)
23
PAT (Basic Level) Practice (中文)1049 数列的片段和 (20 分)
24
PAT (Basic Level) Practice (中文)1021 个位数统计 (15 分)
25
PAT (Basic Level) Practice (中文)1048 数字加密 (20 分)
26
PAT (Basic Level) Practice (中文)1019 数字黑洞 (20 分)
27
PAT (Basic Level) Practice (中文)1017 A除以B (20 分)
28
PAT (Basic Level) Practice (中文)1016 部分A+B (15 分)
29
PAT (Basic Level) Practice (中文)1015 德才论 (25 分)
30
PAT (Basic Level) Practice (中文)1014 福尔摩斯的约会 (20 分)

PAT (Basic Level) Practice (中文)1034 有理数四则运算 (20 分)

1034 有理数四则运算 (20 分)

本题要求编写程序,计算 2 个有理数的和、差、积、商。

输入格式:

输入在一行中按照 a1/b1 a2/b2 的格式给出两个分数形式的有理数,其中分子和分母全是整型范围内的整数,负号只可能出现在分子前,分母不为 0。

输出格式:

分别在 4 行中按照 有理数1 运算符 有理数2 = 结果 的格式顺序输出 2 个有理数的和、差、积、商。注意输出的每个有理数必须是该有理数的最简形式 k a/b,其中 k 是整数部分,a/b 是最简分数部分;若为负数,则须加括号;若除法分母为 0,则输出 Inf。题目保证正确的输出中没有超过整型范围的整数。

输入样例 1:

代码语言:javascript
复制
2/3 -4/2

输出样例 1:

代码语言:javascript
复制
2/3 + (-2) = (-1 1/3)
2/3 - (-2) = 2 2/3
2/3 * (-2) = (-1 1/3)
2/3 / (-2) = (-1/3)

输入样例 2:

代码语言:javascript
复制
5/3 0/6

输出样例 2:

代码语言:javascript
复制
1 2/3 + 0 = 1 2/3
1 2/3 - 0 = 1 2/3
1 2/3 * 0 = 0
1 2/3 / 0 = Inf

这道题算是比较有想法的模拟题了,可以做的很麻烦,也可以很简单, 我的代码虽然很长,但是很简单~个人认为

对于加减乘除,无非都可以看做两个分数的运算,通分相加减,我们要做的就是写一个通用的最简真分数的函数,每次两个运算

数都输出最简形式,等式右边也是这样~

代码语言:javascript
复制
// luogu-judger-enable-o2
#include<bits/stdc++.h>
#include<unordered_set>
#define rg register ll
#define inf 2147483647
#define min(a,b) (a<b?a:b)
#define max(a,b) (a>b?a:b)
#define ll long long
#define maxn 300005
#define lb(x) (x&(-x))
const double eps = 1e-6;
using namespace std;
inline ll read()
{
	char ch = getchar(); ll s = 0, w = 1;
	while (ch < 48 || ch>57) { if (ch == '-')w = -1; ch = getchar(); }
	while (ch >= 48 && ch <= 57) { s = (s << 1) + (s << 3) + (ch ^ 48); ch = getchar(); }
	return s * w;
}
inline void write(ll x)
{
	if (x < 0)putchar('-'), x = -x;
	if (x > 9)write(x / 10);
	putchar(x % 10 + 48);
}
ll a,b,c,d,cnt;
char s;
inline ll gcd(ll a,ll b)
{
    if(b==0)return a;
    return gcd(b,a%b);
}
inline void f(ll x,ll y)
{
    if(x==c&&y==d&&x==0)
    {
        cnt=1;
    }
    if(x<0&&y<0)
    {
        x*=-1;y*=-1;
    }
    ll flag=0,flag2=0;
    if(x<0)
    {
        flag=1;
        cout<<"(",flag2=1;
    }
    ll k=gcd(x,y);
    //cout<<k<<endl;
    x/=k,y/=k;
    if(y<0)
    {
        ll tep=x;
        y*=-1,x*=-1;
        if(tep>0)
        {
            flag=1;
            if(flag2==0)
        cout<<"(";
        }
    }
    if(y==1)
    {
        cout<<x;
        if(flag)cout<<")";
        return ;
    }
    if(x<0&&abs(x)>y)
    {
        if(abs(x)>y)cout<<x/y<<" "<<abs(x%y)<<"/"<<y;
    }
     else if(x>0&&abs(x)>y)
    {
        if(abs(x)>y)cout<<x/y<<" "<<abs(x%y)<<"/"<<y;
    }
    else  if(x<y)cout<<x<<"/"<<y;
    if(flag)cout<<")";
}
int main()
{
    cin>>a>>s>>b>>c>>s>>d;
    f(a,b);cout<<" + ";f(c,d);cout<<" = ";f(a*d+c*b,b*d);
    cout<<endl;
    f(a,b);cout<<" - ";f(c,d);cout<<" = ";f(a*d-c*b,b*d);
    cout<<endl;
    f(a,b);cout<<" * ";f(c,d);cout<<" = ";f(a*c,b*d);
    cout<<endl;

    f(a,b);cout<<" / ";f(c,d);cout<<" = ";
    if(cnt)
    {
        cout<<"Inf";
    }
    else f(a*d,b*c);
    cout<<endl;
   	return 0;
}
下一篇
举报
领券