疑问
暂无
代码
//为什么是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;
}
反思
- 我的代码好丑.jpg。
二刷代码
分数的四则运算总的来说还是非常简单的,主要需要注意几个细节点:
分数的化简reduction()
:
- 分母为负数;
- 分子为0;
- 分子分母最简化(除以最大公约数)
分数的输出show()
:
- 分数要先化简;
- 分数如果是整数?(包括0)
- 分数是假分数
- 分数是真分数?
除数为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;
}