PAT 1088. Rational Arithmetic (20) 分数模拟计算+字符串处理

来源:互联网 发布:gt610疯牛病版 知乎 编辑:程序博客网 时间:2024/06/18 02:11
#include<iostream>#include<cstdio>#include<algorithm>#include<queue>#include<string.h>#include<cmath>#include<string>using namespace std;///*************************题意:分数运算输出表达式时要为整数+分数形式*************************//************************求解要点:a1/a2 op b1/b2 =c1/c2首先要约分化简。约分通过计算最大公约数即 if(b%a==0)return a;elsereturn getgys(a,b-a) 来计算,同时b必须比a大然后同除计算时不拆出整数,直接用分子分母来运算同时注意处理符号和0的问题。************************//***********************笔记:*********************/#define M 100005#define INF 0xffffflong long getgys(long long  a,long long b){long long t;if(a==0||b==0)return 1;if(a<0)a=a*(-1);if(b<0)b=b*(-1);if(a>b){t=a;a=b;b=t;}if(b%a==0)return a;elsereturn getgys(a,b-a);}void putnum(long long a1, long long a2){long long a3,a4,a5;int f=0;if(a1==0){printf("0");return ;}if(a2==0){printf("Inf");return ;}if(a1<0){printf("(");a1=(-1)*a1;printf("-");f=1;}a3=a1/a2;a4=a1%a2;if(a3!=0)printf("%lld",a3);if(a4!=0){if(a3!=0)cout<<" ";printf("%lld/%lld",a4,a2);}if(f)printf(")");}void deal(long long &a1,long long &a2){if(a2<0 && a1>=0){a1=(-1)*a1;a2=(-1)*a2;}else if(a1< 0 && a2<0){a1=(-1)*a1;a2=(-1)*a2;}}int main(){long long a1,a2,a3,a4,b1,b2,b3,b4;long long c1,c2,c3,c4,c5;long long gys;scanf("%lld/%lld",&a1,&a2);deal(a1,a2);gys=getgys(a1,a2);a1=a1/gys;a2=a2/gys;scanf("%lld/%lld",&b1,&b2);deal(b1,b2);gys=getgys(b1,b2);b1=b1/gys;b2=b2/gys;putnum(a1,a2);printf(" + ");putnum(b1,b2);printf(" = ");c1=a1*b2+a2*b1;c2=a2*b2;gys=getgys(c1,c2);c1=c1/gys;c2=c2/gys;putnum(c1,c2);cout<<endl;putnum(a1,a2);printf(" - ");putnum(b1,b2);printf(" = ");c1=a1*b2-a2*b1;c2=a2*b2;gys=getgys(c1,c2);c1=c1/gys;c2=c2/gys;putnum(c1,c2);cout<<endl;putnum(a1,a2);printf(" * ");putnum(b1,b2);printf(" = ");c1=a1*b1;c2=a2*b2;gys=getgys(c1,c2);c1=c1/gys;c2=c2/gys;putnum(c1,c2);cout<<endl;putnum(a1,a2);printf(" / ");putnum(b1,b2);printf(" = ");c1=a1*b2;c2=a2*b1;deal(c1,c2);gys=getgys(c1,c2);c1=c1/gys;c2=c2/gys;putnum(c1,c2);cout<<endl;return 0;}

原创粉丝点击