PAT A1088 Rational Arithmetic

PAT A1088 Rational Arithmetic

在这里插入图片描述

Sample Input 1:

2/3 -4/2

Sample Output 1:

2/3 + (-2) = (-1 1/3)
2/3 - (-2) = 2 2/3
2/3 * (-2) = (-1 1/3)
2/3 / (-2) = (-1/3)

Sample Input 2:

5/3 0/6

Sample Output 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:
    模拟分数的四则运算

  • TIPS 1:要注意乘法的过程中可能会溢出 -> 要使用long long 存储分子分母

  • code 1:

#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
struct Fraction{
	ll up, down;
};
ll gcd(ll a, ll b){
	return !b ? a : gcd(b, a % b);
}
Fraction reduction(Fraction a){
	if(a.down < 0){
		a.up = -a.up;
		a.down = -a.down;
	}
	if(a.up == 0){
		a.down = 1;
	}else{
		int d = gcd(abs(a.up), abs(a.down));
		a.up /= d;
		a.down /= d;
	}
	return a;
}
Fraction add(Fraction a, Fraction b){
	Fraction result;
	result.up = a.up * b.down + a.down * b.up;
	result.down = a.down * b.down;
	return reduction(result);
} 
Fraction sub(Fraction a, Fraction b){
	Fraction result;
	result.up = a.up * b.down - a.down * b.up;
	result.down = a.down * b.down;
	return reduction(result);
}
Fraction multi(Fraction a, Fraction b){
	Fraction result;
	result.up = a.up * b.up;
	result.down = a.down * b.down;
	return reduction(result);
}
Fraction div(Fraction a, Fraction b){
	Fraction result;
	result.up = a.up * b.down;
	result.down = a.down * b.up;
	return reduction(result);
}
void output(Fraction a){
	a = reduction(a);
	if(a.up < 0) printf("(");
	if(a.down == 1){	//整数 
		printf("%d", a.up);
	}else if(abs(a.up) > a.down){	//假分数 
		printf("%d %d/%d", a.up/a.down, abs(a.up) % a.down, a.down);	
	}else	//分数 
		printf("%d/%d", a.up, a.down);
	if(a.up < 0) printf(")");
}
int main(){
	int aup, adown, bup, bdown;
	scanf("%d/%d %d/%d", &aup, &adown, &bup, &bdown);
	Fraction a, b;
	a.up = aup; a.down = adown;
	b.up = bup; b.down = bdown;
	output(a); printf(" + "); output(b); printf(" = "); output(add(a, b)); printf("\n");
	output(a); printf(" - "); output(b); printf(" = "); output(sub(a, b)); printf("\n");
	output(a); printf(" * "); output(b); printf(" = "); output(multi(a, b)); printf("\n");
	output(a); printf(" / "); output(b); printf(" = "); 
	if(b.up == 0) printf("Inf");
	else output(div(a, b)); 
	printf("\n");
	return 0;
} 
  • T3 code:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
struct Frac
{
    ll up, down;
}fa, fb;
ll gcd(ll a, ll b)
{
    return b != 0 ? gcd(b, a % b) : a;
}
Frac Reduce(Frac f)
{
    if(f.down < 0)
    {
        f.up = -f.up;
        f.down = -f.down;
    }
    if(f.up == 0)
    {
        f.down = 1;
    }else
    {
        int d = gcd(abs(f.up), f.down);
        f.up /= d; f.down /= d;
    }
    return f;
}
Frac ADD(Frac a, Frac b)
{
    Frac ans;
    ans.up = a.up * b.down + b.up * a.down;
    ans.down = a.down * b.down;
    return Reduce(ans);
}
Frac Minus(Frac a, Frac b)
{
    Frac ans;
    ans.up = a.up * b.down - b.up * a.down;
    ans.down = a.down * b.down;
    return Reduce(ans);
}
Frac Product(Frac a, Frac b)
{
    Frac ans;
    ans.up = a.up * b.up;
    ans.down = a.down * b.down;
    return Reduce(ans);
}
Frac Div(Frac a, Frac b)
{
    Frac ans;
    ans.up = a.up * b.down;
    ans.down = a.down * b.up;
    return Reduce(ans);
}
void ShowAns(Frac ans)
{
    if(ans.up < 0) printf("(");
    if(ans.down == 0)
    {
        printf("Inf");
    }else if(abs(ans.down) == 1)
    {
        printf("%lld", ans.down < 0 ? -ans.up : ans.up);
    }else if(abs(ans.up) > ans.down)
    {
        printf("%lld %lld/%lld", ans.up / ans.down, abs(ans.up) % ans.down, ans.down);
    }else
    {
        printf("%lld/%lld", ans.up, ans.down);
    }
    if(ans.up < 0) printf(")");
}
int main()
{
    scanf("%lld/%lld %lld/%lld", &fa.up, &fa.down, &fb.up, &fb.down);
    fa = Reduce(fa); fb = Reduce(fb);
    ShowAns(fa); printf(" + "); ShowAns(fb); printf(" = "); ShowAns(ADD(fa, fb)); printf("\n");
    ShowAns(fa); printf(" - "); ShowAns(fb); printf(" = "); ShowAns(Minus(fa, fb)); printf("\n");
    ShowAns(fa); printf(" * "); ShowAns(fb); printf(" = "); ShowAns(Product(fa, fb)); printf("\n");
    ShowAns(fa); printf(" / "); ShowAns(fb); printf(" = "); ShowAns(Div(fa, fb)); printf("\n");
    return 0;
}

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看REAdMe.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看REAdMe.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看READme.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 、 1资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看READmE.文件(md如有),本项目仅用作交流学习参考,请切勿用于商业用途。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值