PTA1034 有理数四则运算 (20 分)

在这里插入图片描述
在这里插入图片描述

//鹅鹅鹅,太粗鲁了
//别看了,我都看不下去,请绕路
#include<stdio.h>
#include<math.h>
print(int a1,int b1,int f);//输出=号后面的结果
void yuefen(int *p1,int *p2);//将m,n进行约分
void judge(int *p1,int *p2);//判断m,n不同正负时的情况
void main()
{
    int a1,b1,a2,b2;
    int m,n,t;
    scanf("%d/%d%d/%d",&a1,&b1,&a2,&b2);
    for(t=1;t<=4;t++){//+,-,*,/进行四次
        print(a1,b1,1);
        if(t==1){
            printf(" + ");
            print(a2,b2,1);
            printf(" = ");
            m=a1*b2+a2*b1;
            n=b1*b2;
            if(n<0){//保证分母不为负数
                m=-m;
                n=-n;
            }
            judge(&m,&n);
            print(m,n,1);
            printf("\n");
        }
        if(t==2){
            printf(" - ");
            print(a2,b2,1);
            printf(" = ");
            m=a1*b2-a2*b1;
            n=b1*b2;//注意此时的m,n因为已经被指了,所以值有变
            if(n<0){
                m=-m;
                n=-n;
            }
            judge(&m,&n);
            print(m,n,1);
            printf("\n");
        }
        if(t==3){
            printf(" * ");
            print(a2,b2,1);
            printf(" = ");
            m=a1*a2;
            n=b1*b2;
            if(n<0){
                m=-m;
                n=-n;
            }
            judge(&m,&n);
            print(m,n,1);
            printf("\n");
        }
        if(t==4){
            printf(" / ");
            print(a2,b2,1);
            printf(" = ");
            if(print(a2,b2,2)==48){//分母为零的话,输出Inf
                printf("Inf");continue;
            }
            m=a1*b2;
            n=a2*b1;
            if(n<0){
                m=-m;
                n=-n;
            }
            judge(&m,&n);
            print(m,n,1);
            printf("\n");
        }
    }
}

print(int a1,int b1,int f)
{
    int i;
    char a[10];//将每一部分数据放到a里面
    if(a1>0){
        if(a1>b1){
            if(a1%b1==0){
                a[0]='0'+b1/a1;
                a[1]='\0';
            }else{
                a[0]='0'+a1/b1;
                a[1]=' ';
                a[2]=a1%b1+'0';
                a[3]='/';
                a[4]=b1+'0';
                a[5]='\0';
            }
        }else{
            if(a1==b1){
                a[0]='1';
                a[1]='\0';
            }else{
                a[0]=a1+'0';
                a[1]='/';
                a[2]=b1+'0';
                a[3]='\0';
            }
        }
    }else{
        if(a1==0){
            a[0]='0';
            a[1]='\0';
        }else{
            if((-1)*a1>b1){
                if(a1*(-1)%b1==0){
                    a[0]='(';
                    a[1]='-';
                    a[2]=a1*(-1)/b1+'0';
                    a[3]=')';
                    a[4]='\0';
                }else{
                    a[0]='(';
                    a[1]='-';
                    a[2]='0'+a1/b1*(-1);
                    a[3]=' ';
                    a[4]=a1*(-1)%b1+'0';
                    a[5]='/';
                    a[6]=b1+'0';
                    a[7]=')';
                a[8]='\0';
                }
            }else{
                if(a1*(-1)==b1){
                    a[0]='(';
                    a[1]='-';
                    a[2]='1';
                    a[3]=')';
                    a[4]='\0';
                }else{
                    a[0]='(';
                    a[1]='-';
                    a[2]=a1*(-1)+'0';
                    a[3]='/';
                    a[4]=b1+'0';
                    a[5]=')';
                    a[6]='\0';
                }
            }
        }
    }
    if(f==1){//此时有输出的情况,有不输出的情况,所以函数不指明类型,默认为int
        for(i=0;a[i]!='\0';i++){//由于输出分子分母可能存在大于9的情况,所以字符输出需要注意
            if(a[i]!='+'&&a[i]!='-'&&a[i]!='*'&&a[i]!='/'&&a[i]!='('&&a[i]!=')'&&a[i]!=' '){
                printf("%d",a[i]-'0');
            }else{
                printf("%c",a[i]);
            }
        }
    }
    if(f==2){
        return a[0];
    }
}
void yuefen(int *p3,int *p4)
{
    int i=0;
    do{
        i++;
        if(*p3%i==0&&*p4%i==0){
            *p3=*p3/i;
            *p4=*p4/i;
            i=1;
        }
    }while(i<*p4);
}
void judge(int *p1,int *p2)
{
    if((*p1)*(*p2)<0){
        *p1=fabs(*p1);
        *p2=fabs(*p2);
        yuefen(p1,p2);
        *p1=-*p1;
    }else{
        *p1=fabs(*p1);
        *p2=fabs(*p2);
        yuefen(p1,p2);
    }
}
//对程序做进一步的优化,采用的解决方法不变
#include<string.h>//这里没有用到stdio.h,而是使用string.h头文件,暂时还不能理解 
int GYS(long a,long b);//求出a,b的最小公倍数 
void func(long a,long b);//对每一块进行输出 
void main()
{
 	long a1,b1,a2,b2;
 	char ch[4]={'+','-','*','/'};
 	int i;
 	scanf("%ld/%ld %ld/%ld",&a1,&b1,&a2,&b2);
 	for(i=0;i<4;i++){
 		func(a1,b1);
 		printf(" %c ",ch[i]);
 		func(a2,b2);
 		printf(" = ");
 		switch(ch[i]){//此处使用switch结构,再调用函数输出可省去每次循环的相同结构 
 			case '+': func(a1*b2+a2*b1,b1*b2);break;
			case '-': func(a1*b2-a2*b1,b1*b2);break;
			case '*': func(a1*a2,b1*b2);break;
			case '/': func(a1*b2,b1*a2);break;
		}
		printf("\n");
	 }
}
int GYS(long a,long b)
{
  	return b==0?a:GYS(b,a%b);//函数的递归调用求最小公倍数 
}
void func(long a,long b)
{
	int sign=1;
	long mcd=1;
	if(b==0){
		printf("Inf");
		return;//return相当于函数的break,表示不返回任何值 
	}
	if(a<0){
		a=-a;
		sign*=-1;
	}
    if(b<0){
		b=-b;
		sign*=-1;
	}
	mcd=GYS(a,b);
	a/=mcd;b/=mcd;
	if(sign<0)
		printf("(-");
	if(a/b&&a%b)
		printf("%ld %ld/%ld",a/b,a%b,b);
	else if(a%b)
		printf("%ld/%ld",a,b);
	else
		printf("%ld",a/b);
	if(sign<0)printf(")");
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
#include<stdio.h> #include<stdlib.h> struct four { double a; struct four *next; //定义结构体,作为链表的节点. }; void main() { double sum(void); //函数声明. 该函数返回等式的计算结果. 有优先级的运算符号在函数内部先进行计算。 double sum1; printf("请输入等式,以 '=' 结束, 例如“ 2*2*3-2/2= ” 结果将自动保留六位有效数字\n"); sum1=sum(); printf("该等式的结果为:\t%f\n\n",sum1); } double sum(void) { struct four *head,*pnew,*ptail,*p,*q; //结构体成员. char ah; double s=0,last; //last作为 pnew->a 的前一个数值. int j=1; q=(struct four *)malloc(sizeof(struct four)); scanf("%lf%c",&q->a,&ah); last=q->a; while(j==1 && ah!='=') //头节点的建立. { switch(ah) //对运算符号的优先级进行选择,优先级高的先进行计算. { case '+': j=0; continue; break; case '-': j=0; continue; break; case '*': q=(struct four *)malloc(sizeof(struct four)); scanf("%lf",&q->a); q->a=last*q->a; break; case '/': q=(struct four *)malloc(sizeof(struct four)); scanf("%lf",&q->a); q->a=last/q->a; break; default: printf("Error!\n"); //当运算符号出错时的处理. exit(0); } last=q->a; scanf("%c",&ah); } pnew=(struct four *)malloc(sizeof(struct four)); pnew->a=q->a; //将头节点的信息传递给 head 和 ptail. head=ptail=pnew; while(ah!='=') //接下来节点的建立. { pnew=(struct four *)malloc(sizeof(struct four)); scanf("%lf",&pnew->a); switch(ah) { case '*': pnew->a=last*pnew->a; break; case '/': pnew->a=last/pnew->a; break; case '+': break; case '-': pnew->a=-pnew->a;break; default: printf("Error!\n"); //当运算符号出错时的处理. exit(0); } scanf("%c",&ah); if(ah=='-' || ah=='+'|| ah=='=') //将值进行传递 ptail->next=pnew. { ptail->next=pnew; ptail=pnew; } last=pnew->a; } ptail->next=NULL; p=head; while(p!=NULL) //各个节点数值相加的结果,有优先级符号的已经先计算了. { s=s+(p->a); p=p->next; } return s; //返回运算结果. }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值