本题要求编写程序,计算 2 个有理数的和、差、积、商。
输入格式:
输入在一行中按照 a1/b1 a2/b2
的格式给出两个分数形式的有理数,其中分子和分母全是整型范围内的整数,负号只可能出现在分子前,分母不为 0。
输出格式:
分别在 4 行中按照 有理数1 运算符 有理数2 = 结果
的格式顺序输出 2 个有理数的和、差、积、商。注意输出的每个有理数必须是该有理数的最简形式 k a/b
,其中 k
是整数部分,a/b
是最简分数部分;若为负数,则须加括号;若除法分母为 0,则输出 Inf
。题目保证正确的输出中没有超过整型范围的整数。
输入样例 1:
2/3 -4/2
输出样例 1:
2/3 + (-2) = (-1 1/3)
2/3 - (-2) = 2 2/3
2/3 * (-2) = (-1 1/3)
2/3 / (-2) = (-1/3)
输入样例 2:
5/3 0/6
感谢博主:https://blog.csdn.net/qq_36122764/article/details/82354968
#include<iostream> #include<math.h> using namespace std; long long int gcd(long long int t1,long long int t2){ //求最大公约数 return t2==0? t1:gcd(t2,t1%t2); } int jian(long long int a,long long int b){ //对a/b化简并输出 long long int t=0,x=0; if(b==0){//判断分母是否为0 cout<<"Inf"; return 0; } long long int k=gcd(abs(a),b); a=a/k; //化简分数 b=b/k; t=abs(a)/b; //整数部分 x=abs(a)-t*b; //分子部分 if(a<0) { if((t!=0)&&(x!=0))printf("(-%lld %lld/%lld)",t,x,b); if((t!=0)&&(x==0))printf("(-%lld)",t); if((t==0)&&(x!=0))printf("(-%lld/%lld)",x,b); if((t==0)&&(x==0))printf("0"); } if(a>=0){ if(t!=0&&x!=0)printf("%d %d/%d",t,x,b); else if(t!=0&&x==0)printf("%d",t); else if(t==0&&x!=0)printf("%d/%d",x,b ); else printf("0"); } return 0; } int main(){ long long int a1,b1,a2,b2; scanf("%lld/%lld",&a1,&b1); scanf("%lld/%lld",&a2,&b2); //+ jian(a1,b1); cout<<' '<<'+'<<' '; jian(a2,b2); cout<<' '<<'='<<' '; jian(a1*b2+a2*b1,b1*b2); cout<<endl; //- jian(a1,b1); cout<<' '<<'-'<<' '; jian(a2,b2); cout<<' '<<'='<<' '; jian(a1*b2-a2*b1,b1*b2); cout<<endl; //* jian(a1,b1); cout<<' '<<'*'<<' '; jian(a2,b2); cout<<' '<<'='<<' '; jian(a1*a2,b1*b2); cout<<endl; /// jian(a1,b1); cout<<' '<<'/'<<' '; jian(a2,b2); cout<<' '<<'='<<' '; if(a2<0)jian(a1*b2*a2/abs(a2),b1*abs(a2));//abs(a2)取符号 else jian(a1*b2,b1*a2); cout<<endl; }