PAT A1088 Rational Arithmetic

疑问

暂无

代码

//为什么是rational呢,因为分数都是有理数呀
#include<cstdio>
#include<algorithm>

using namespace std;

typedef long long ll;

struct Fraction{
	ll up;
	ll down;
};

Fraction x;
Fraction y; 

long long gcd(ll a,ll b){
	if(b == 0){
		return a;
	}else{
		return gcd(b,a%b);
	}
} 
 
void showResult(Fraction res){
	//1.如果是负数
	if(res.up < 0){
		printf("(");
		//如果是整数
		if(res.down == 1){
			printf("%lld",res.up);
		}else if(abs(res.up) > res.down){
			//如果是假分数
			printf("%lld ",res.up / res.down);
			printf("%lld/%lld",abs(res.up) % res.down,res.down); 
		}else{
			//是真分数
			printf("%lld/%lld",res.up,res.down); 
		} 
		printf(")");
	}else{
		//如果是整数
		if(res.down == 1){
			printf("%lld",res.up);
		}else if(abs(res.up) > res.down){
			//如果是假分数
			printf("%lld ",res.up / res.down);
			printf("%lld/%lld",abs(res.up) % res.down,res.down); 
		}else{
			//是真分数
			printf("%lld/%lld",res.up,res.down); 
		} 
	} 
} 

Fraction reduction(Fraction f){
	//如果分母是负数 
	if(f.down < 0){
		f.up = -f.up;
		f.down = -f.down;
	}
	//如果是0 
	if(f.up == 0){
		f.down = 1;
	}else{
		long long num = gcd(abs(f.up),abs(f.down));
		f.up = f.up / num;
		f.down = f.down / num;
	}
	return f; 
}

//加法 
void add(Fraction x,Fraction y){
	Fraction res;
	showResult(x);
	printf(" + ");
	showResult(y);
	printf(" = "); 
	
	res.up = x.up * y.down + y.up * x.down;
	res.down = x.down * y.down;
	
	res = reduction(res);
	
	showResult(res);
	
} 

//减法 
void sub(Fraction x,Fraction y){
	Fraction res;
	showResult(x);
	printf(" - ");
	showResult(y);
	printf(" = "); 
	
	res.up = x.up * y.down - y.up * x.down;
	res.down = x.down * y.down;
	
	res = reduction(res);
	
	showResult(res);
} 

//乘法 
void multi(Fraction x,Fraction y){
	Fraction res;
	showResult(x);
	printf(" * ");
	showResult(y);
	printf(" = "); 
	
	res.up = x.up * y.up;
	res.down = x.down * y.down;
	
	res = reduction(res);
	
	showResult(res);
} 

//除法 
void divide(Fraction x,Fraction y){
	Fraction res;
	showResult(x);
	printf(" / ");
	showResult(y);
	printf(" = "); 
	
	if(y.up == 0){
		printf("Inf");
	}else{
		res.up = x.up * y.down;
		res.down = x.down * y.up;
		res = reduction(res);
		showResult(res); 
	}
} 

int main(){
	scanf("%lld/%lld %lld/%lld",&x.up,&x.down,&y.up,&y.down);
	
	x = reduction(x);
	y = reduction(y);
	
	add(x,y);
	
	printf("\n");
	
	sub(x,y);
	printf("\n");
	multi(x,y);
	printf("\n");
	//注意除法要特判 
	divide(x,y); 
	
	return 0;
}

反思

  1. 我的代码好丑.jpg。

二刷代码

分数的四则运算总的来说还是非常简单的,主要需要注意几个细节点:
分数的化简reduction()

  1. 分母为负数;
  2. 分子为0;
  3. 分子分母最简化(除以最大公约数)

分数的输出show()

  1. 分数要先化简;
  2. 分数如果是整数?(包括0)
  3. 分数是假分数
  4. 分数是真分数?

除数为0的情况

//注意对被除数为0的理解 
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;

struct fraction{
	ll up;
	ll down;
	fraction(){
		up=0;
		down=1;
	}
};

ll gcd(ll a,ll b){
	if(b==0){
		return a;
	}else{
		return 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{
		//化简
		ll c = gcd(abs(a.up),a.down);
		a.up /= c;
		a.down /= c; 
	}
	return a;
}

fraction sum(fraction a,fraction b){
	//注意返回化简的
	fraction res;
	res.up = a.up*b.down+a.down*b.up; 
	res.down = a.down*b.down;
	return reduction(res);
}

fraction difference(fraction a,fraction b){
	//返回减法
	fraction res;
	res.up = a.up*b.down-a.down*b.up; 
	res.down = a.down*b.down;
	return reduction(res);
}

fraction product(fraction a,fraction b){
	//返回乘法
	fraction res;
	res.up = a.up*b.up; 
	res.down = a.down*b.down;
	return reduction(res);	 
}

fraction quotient(fraction a,fraction b){
	//返回除法
	fraction res;
	res.up = a.up*b.down;
	res.down = a.down*b.up;
	return reduction(res); 
}

void show(fraction a){
	//首先是化简
	a = reduction(a);
	
	if(a.down==1){
		printf("%lld",a.up);
	}else{
		if(abs(a.up)>a.down){
			printf("%lld %lld/%lld",a.up/a.down,abs(a.up)%a.down,a.down);
		}else{
			//直接输出
			printf("%lld/%lld",a.up,a.down); 
		}
	} 
}

void resShow(fraction a){
	if(a.up<0){
		printf("(");
		show(a);
		printf(")");
	}else{
		show(a);
	}
} 

int main(){
	fraction a;
	fraction b;
	scanf("%lld/%lld %lld/%lld",&a.up,&a.down,&b.up,&b.down);
	//首先化简
	a=reduction(a);
	b=reduction(b);
	
	//接下来进行加减乘除预算 
	fraction rs = sum(a,b);
	resShow(a);
	printf(" + ");
	resShow(b);
	printf(" = ");
	resShow(rs);
	printf("\n");	
	
	fraction rd = difference(a,b);
	resShow(a);
	printf(" - ");
	resShow(b);
	printf(" = ");
	resShow(rd);	
	printf("\n");
		
	fraction rp = product(a,b);
	resShow(a);
	printf(" * ");
	resShow(b);
	printf(" = ");
	resShow(rp);	
	printf("\n");
		
	//需要进行特殊的判断。因为除数不能为零 
	if(b.up==0){
		resShow(a);
		printf(" / ");
		resShow(b);
		printf(" = ");
		printf("Inf\n");		
	}else{
		fraction rq = quotient(a,b);	
		resShow(a);
		printf(" / ");
		resShow(b);
		printf(" = ");
		resShow(rq);
		printf("\n");		
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值