1034. 有理数四则运算(20)

来源:互联网 发布:股票五档的数据怎么看 编辑:程序博客网 时间:2024/05/29 17:35

本题要求编写程序,计算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/32/3 * (-2) = (-1 1/3)2/3 / (-2) = (-1/3)
输入样例2:
5/3 0/6
输出样例2:
1 2/3 + 0 = 1 2/31 2/3 - 0 = 1 2/31 2/3 * 0 = 01 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);//其实这块的处理有点烦琐,但是写这东西已经够烦了,不想再动脑筋了 elseprintf("%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);elseprintf("%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");}elseprintf("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; } 


纯属新手操作,大佬勿喷

原创粉丝点击