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

本题要求编写程序,计算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;
 } 


纯属新手操作,大佬勿喷

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值