1034 有理数四则运算 (20 分)(失败版,测试点2,3运行不成功)

题目概述:
本题要求编写程序,计算 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
结尾无空行

代码:

#include <stdio.h>
#include <math.h>

long long gcd(long long a,long long b){
    
    
	if(b==0) 
	    return a;//返回a,即返回上一步的b 
	return gcd(b,a%b);
}

int judge_huzhi(long long *a,long long *b)//辗转相除 
{
    
    
	if (*a==0)
	{
    
    
		*b=1;return 0;
	}
	long long x=0,y=0,temp=-1;
	x=abs(*a);y=abs(*b);
	if (x<y)
	    temp=gcd(y,x);
	else
	    temp=gcd(x,y);
	*a=(*a)/temp;*b=(*b)/temp;
	return 0;
}

int tran_print(int x1,int y1,int x2,int y2,long long z1,long long z2,int flag1)
{
    
    
    if (y1==1||x1==0)
		(x1<0)?printf("(%d)",x1):printf("%d",x1);
	else
	{
    
    
		int temp0=floor(abs(x1)/y1);
		if (x1/y1==0)
			(x1<0)?printf("(%d/%d)",x1,y1):printf("%d/%d",x1,y1);
		else
			(x1<0)?printf("(-%d %d/%d)",temp0,abs(x1)%y1,y1):printf("%d %d/%d",temp0,x1%y1,y1);
	}
	switch(flag1)
	{
    
    
		case 1:printf(" + ");break;
		case 2:printf(" - ");break;
		case 3:printf(" * ");break;
		case 4:printf(" / ");break;
		case 5:printf(" / ");break;
	}
	if (y2==1||x2==0)
		(x2<0)?printf("(%d) = ",x2):printf("%d = ",x2);
	else
	{
    
    
		int temp1=floor(abs(x2)/y2);
		if (x2/y2==0)
			(x2<0)?printf("(%d/%d) = ",x2,y2):printf("%d/%d = ",x2,y2);
		else
			(x2<0)?printf("(-%d %d/%d) = ",temp1,abs(x2)%y2,y2):printf("%d %d/%d = ",temp1,x2%y2,y2);
	}
	if (flag1==5)
		printf("Inf");
	else
	{
    
    
		if (z2==1||z1==0)
		    (z1<0)?printf("(%lld)\n",z1):printf("%lld\n",z1);
		else
		{
    
    
			long long t1,t2,temp2;
			if (z1<0)
			    t1=(-1)*z1;
			else
			    t1=z1;
			if (z2<0)
			    t2=(-1)*z2;
			else
			    t2=z2;
			temp2=t1/t2;
			if (temp2==0)
			    ((z1<0&&z2<0)||(z1>0&&z2>0))?printf("%lld/%lld\n",t1,t2):printf("(-%lld/%lld)\n",t1,t2);
			else
			    ((z1<0&&z2<0)||(z1>0&&z2>0))?printf("%lld %lld/%lld\n",temp2,t1%t2,t2):printf("(-%lld %lld/%lld)\n",temp2,t1%t2,t2);
		}
	}
	return 0;
}

int main()
{
    
    
	long long zi1=0,zi2=0,mu1=0,mu2=0,flag=0;
	long long plus_zi=0,plus_mu=0,minus_zi=0,minus_mu=0,mul_zi=0,mul_mu=0,div_zi=0,div_mu=0; 
	scanf("%lld/%lld %lld/%lld",&zi1,&mu1,&zi2,&mu2);
	//转假分数 
	judge_huzhi(&zi1,&mu1);
	judge_huzhi(&zi2,&mu2);
	//计算各运算分子分母并化简 
    plus_zi=zi1*mu2+zi2*mu1;plus_mu=mu1*mu2;judge_huzhi(&plus_zi,&plus_mu);
	minus_zi=zi1*mu2-  zi2*mu1;minus_mu=mu1*mu2;judge_huzhi(&minus_zi,&minus_mu);
	mul_zi=zi1*zi2;mul_mu=mu1*mu2;judge_huzhi(&mul_zi,&mul_mu);
	div_zi=zi1*mu2;div_mu=mu1*zi2;
	if (div_mu==0)//对于除法分母为0的情况,在打印中说明
		flag=1;
	else
	    judge_huzhi(&div_zi,&div_mu);
	tran_print(zi1,mu1,zi2,mu2,plus_zi,plus_mu,1);
	tran_print(zi1,mu1,zi2,mu2,minus_zi,minus_mu,2);
	tran_print(zi1,mu1,zi2,mu2,mul_zi,mul_mu,3);
	if (flag==1)
	    tran_print(zi1,mu1,zi2,mu2,div_zi,div_mu,5);
	else
	    tran_print(zi1,mu1,zi2,mu2,div_zi,div_mu,4);
}

呜呜呜呜呜,自己一个人写完就是14分,看了各位大佬的代码,把int改成了long long,又把原来自己想的方法改成了辗转相除法求最大公约数,结果还是调不成功,一天了,朋友们,课都没心思听就跟这题耗上了,无语无语无语…
别说了,我是废物,还有一个月不到就要考试了,题库还有61道,等死吧我…

运行结果:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_51461680/article/details/121480190