PTA刷题Basic篇——1034.有理数的四则运算——Day(17)

问题描述

在这里插入图片描述
根据输入的两个算式进行加减乘除的计算。

问题分析

这道题我真的是没做出来,也是看了其他大佬的答案才会,哎,学得还是不够啊。下面给大家说一下我的理解。
首先我们先写一个最简约分的函数,保证可以将分数约分到最简形式。即最大公约数
再写一个函数来判断,参数为a,b,来判断具体的输出格式:
如果a,b同号,则结果为正。
如果a,b异号,则结果为负,结果为负我们就先输出一个"-(",因为负数要求有括号,最后在结尾再输出“)”。注意在这之前我们必须保证a,b非负,因为负号是以字符形式输出的,我们只需要计算出正数即可。
在计算一下a/b的最简形式,如果a%b与a/b都不为0,就按照规则输出(规则主要是负数的输出规则,我们已经说过怎么处理了)
如果一方为0,就只需要输出另一方。
最后是我们的主函数,我遇到的问题是,如果输入这些整数,还要求有"-“和”/"。后来我才知道,可以通过scanf预先给出这些字符,我们只需要输入数字即可。我们将输入的数字作为参数放入我们刚才所写的函数中按照规则输出。然后按照"=","-","*","/"的顺序输出这些字符。
最后利用switch结构,根据运算符来运算结果并输出即可。结果的运算只需要按照分数的计算即可。具体可以看代码。

代码

#include<string.h>
#include <cstdio>
int GYS(long a,long b)
{
    //求出最大公约数
    //例GYS(15,9)=GYS(9,6)=GYS(6,3)=GYS(3,0)=3
 return b==0?a:GYS(b,a%b);
}
void func(long a,long b)
{
 int sign=1;
    //假设最大公约数为1
 long mcd=1;
    //分母为0输出Inf
 if(b==0)
 {
  printf("Inf");
   return;
 }
    //如果a<0,b<0,则a/b>0
    //如果二者有一个小于0,则结果为负数,即sign<0,我们输出负号
 if(a<0)
 {
  a=-a;
  sign*=-1;
 }
    //我们会统一输出负号,所以如果<0,则将它变为正数计算
 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);
    //如果结果小于1,就只输出分数
 else if(a%b)
  printf("%ld/%ld",a,b);
 else
  printf("%ld",a/b);
    //负数括号括回
 if(sign<0)printf(")");
}
int main()
{
    long a1, b1, a2, b2;
    char ch[4] = {'+', '-', '*', '/'};
    int i;
    //可以通过scanf直接输入'\',我们就只需要输入数字
    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]){
            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");
    }
    return 0;
}

答题用时——26min
Q34——finish√

原创文章 101 获赞 13 访问量 2308

猜你喜欢

转载自blog.csdn.net/weixin_44755413/article/details/105726259