本题要求编写程序,计算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输出样例2:
1 2/3 + 0 = 1 2/3 1 2/3 - 0 = 1 2/3 1 2/3 * 0 = 0 1 2/3 / 0 = Inf
这题一处理就乱七八糟的我也很绝望。好歹慢慢扣出来了,网上代码好多给我这种新手看着都特别费劲,好歹模仿出来一个注释都在代码里
整体思路就是
1、对每一个输入的操作数按照输出格式处理,
2、再进行计算
3、对输出结果按照输出格式处理
4、打印
#include<cstdio> #include<cmath> #include<iostream> using namespace std; long long int GCD(long long a, long long b) { //求最大公约数 long long int m = a % b; while(m) { a = b; b = m; m = a % b; } return b; } long long int fun(long long int *a,long long int *b)//转化函数 把输入的分数做处理,化成最简的形式,返回值是假分数前面的假数 { if(!*a)//如果a==0的时候进行处理 { *a=0; *b=1; return -1; } long long int t1=*a,t2=*b,q=0; if(t1<0)t1*=-1; if(t1>=t2)//这里判断是不是假分数 如果是假分数那q就是假分数前面的假数 例如:5/3 即 (1 2/3) 那么q==1 { q=t1/t2; t1=t1-t2*q; if(!t1)// 还有一种特殊的情况:例如4/2 = 2,那么q=2 并且后面没有分数了,要做特殊处理 { *a/=*b;*b=1; return 0; } } long long int gcd=GCD(t1,t2);//这里求剩下分数部分的最简分数的形式 t1/=gcd; t2/=gcd; *a<0?(*a=-1*t1):(*a=t1); *b=t2; return q; } void print(long long int temp,long long int a,int b)//打印结果 temp就是假分数的假数 a,b分别是分子分母 { //打印有三种情况1、这个数是0 2、这个数是真分数 3、这个数是假分数 if(temp<0)//情况 1 cout<<"0"; if(!temp)//情况 2 { if(a>0) if(b==1) printf("%lld",a); //其实这块的处理有点烦琐,但是写这东西已经够烦了,不想再动脑筋了 else printf("%lld/%lld",a,b); if(a<0) if(b==1)printf("(%lld)",a); else printf("(%lld/%lld)",a,b); } else//情况 3 { if(a>0) if(b==1) printf("%lld %lld",temp,a); else printf("%lld %lld/%lld",temp,a,b); if(a<0) if(b==1)printf("(-%lld %lld)",temp,-1*a); else printf("(-%lld %lld/%lld)",temp,-1*a,b); } } void print1(long long int *a,long long int *b,long long int *c,long long int *d,char op) { long long int a1=*a,b1=*b,c1=*c,d1=*d,ans1,ans2,temp1,temp2,temp3,flag=0; temp1=fun(a,b); temp2=fun(c,d); print(temp1,*a,*b);//这里打印第一个数字 switch(op)//打印运算符并且进行计算,加减乘除操作 { case '+': printf(" + "); ans1=a1*d1+b1*c1; ans2=b1*d1; break; case '-': printf(" - "); ans1=a1*d1-b1*c1; ans2=b1*d1; break; case '*': printf(" * "); ans1=a1*c1; ans2=b1*d1; break; case '/'://除法操作要考虑除数等于0的情况所以定义了一个flag变量 flag==0时除数!= 0 printf(" / "); ans1=a1*d1; ans2=b1*c1; if(ans2<0){ans1*=-1;ans2*=-1;} if(ans2==0){flag=1;} default: break; } print(temp2,*c,*d);//打印第二个操作数 printf(" = "); if(!flag){ temp3=fun(&ans1,&ans2);//处理刚才计算出来的结果 print(temp3,ans1,ans2);//打印结果 printf("\n"); } else printf("Inf"); } int main() { long long int a,b,c,d; scanf("%lld/%lld %lld/%lld",&a,&b,&c,&d); long long int a1=a,b1=b,c1=c,d1=d; print1(&a,&b,&c,&d,'+'); a=a1,b=b1,c=c1,d=d1; print1(&a,&b,&c,&d,'-'); a=a1,b=b1,c=c1,d=d1; print1(&a,&b,&c,&d,'*'); a=a1,b=b1,c=c1,d=d1; print1(&a,&b,&c,&d,'/'); return 0; }
纯属新手操作,大佬勿喷