一直有两个测试用例通过不了,按照算法笔记上面改成了long long还是不行。
#include <cstdio>
#include <cstdlib>
typedef long long ll;
struct Fraction{
ll up,down;
};
ll gcd(ll a,ll b){
if(b==0) return a;
else return gcd(b,a%b);
}
Fraction reduction(Fraction result){
if(result.down<0){
result.down=-result.down;
result.up=-result.up;
}
else if(result.up==0){
result.down=1;
}
else{
int d=gcd(abs(result.up),abs(result.down));
result.up/=d;
result.down/=d;
}
return result;
}
Fraction add(Fraction a,Fraction b){
Fraction result;
result.up=a.up*b.down+b.up*a.down;
result.down=a.down*b.down;
return reduction(result);
}
Fraction sub(Fraction a,Fraction b){
Fraction result;
result.up=a.up*b.down-b.up*a.down;
result.down=a.down*b.down;
return reduction(result);
}
Fraction mul(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 showResult(Fraction r){
r=reduction(r);
if(r.up<0) printf("(");
if(r.down==1) printf("%lld",r.up);
else if(abs(r.up)>abs(r.down)) printf("%lld %lld/%lld",r.up/r.down,abs(r.up)%r.down,r.down);
else printf("%lld/%lld",r.up,r.down);
if(r.up<0) printf(")");
}
int main(){
Fraction a,b,res1,res2,res3,res4;
scanf("%lld/%lld %lld/%lld",&a.up,&a.down,&b.up,&b.down);
res1=add(a,b);// +
res2=sub(a,b);// -
res3=mul(a,b);// *
res4=div(a,b);// /
//+
showResult(a);
printf(" + ");
showResult(b);
printf(" = ");
showResult(res1);
printf("\n");
//-
showResult(a);
printf(" - ");
showResult(b);
printf(" = ");
showResult(res2);
printf("\n");
//*
showResult(a);
printf(" * ");
showResult(b);
printf(" = ");
showResult(res3);
printf("\n");
///
showResult(a);
printf(" / ");
showResult(b);
printf(" = ");
if(b.up==0){
printf("Inf");
}
else showResult(res4);
system("pause");
return 0;
}
本文介绍了一个C++程序,用于实现分数的加、减、乘、除运算,并通过最大公约数算法进行分数的简化。程序使用了结构体和自定义函数,如gcd(最大公约数)、reduction(分数简化)、add、sub、mul、div等,实现了分数的精确运算。
1196

被折叠的 条评论
为什么被折叠?



