PAT乙级—1034. 有理数四则运算(20)-native

来源:互联网 发布:彩虹六号最低配优化 编辑:程序博客网 时间:2024/05/16 11:04

本题要求编写程序,计算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<iostream>#include<cstdio>using namespace std;long long GCD(long long a, long long b) {   //求最大公约数      long long m = a % b;      while(m) {          a = b;          b = m;          m = a % b;      }      return b;  }  void PrintFraction(long long a, long long b) {  //将一个分数以规定形式输出      long long k = 1;      if(b == 0) {          printf("Inf");          return;      }      if(a < 0) {          a = -a;          k = -1;      }      long long gcd = GCD(a, b);      a /= gcd;                       //分子分母分别除以最大公约数完成约分      b /= gcd;      if(a / b == 0 && a != 0) {      //因为正负号储存在k里,k为0的时候无法区别,在这一步处理          if(k > 0)              printf("%lld/%lld", a, b);          else              printf("(-%lld/%lld)", a, b);          return;      }      k = k * a / b;      //得到整数部分      a %= b;             //得到分子部分      if(b == 1 && k < 0)          printf("(%lld)", k);      else if(b == 1 && k >= 0)    //分子为0,或者分母为1,结果都是整数,直接输出分子部分(不输出分母)          printf("%lld", k);      else if(k < 0)          printf("(%lld %lld/%lld)", k, a, b);      else          printf("%lld %lld/%lld", k, a, b);  }  void Print(long long a1, long long b1, long long a2, long long b2, char ch) {   //输出一个表达式      long long c1, c2;      PrintFraction(a1, b1);          //范式输出第一个操作数      printf(" %c ", ch);             //输出操作符      PrintFraction(a2, b2);          //范式输出第二个操作数      printf(" = ");                  //输出等号      switch(ch) {                    //范式输出结果      case '+':          c1 = a1 * b2 + a2 * b1;          c2 = b1 * b2;          PrintFraction(c1, c2);          printf("\n");          break;      case '-':          c1 = a1 * b2 - a2 * b1;          c2 = b1 * b2;          PrintFraction(c1, c2);          printf("\n");          break;      case '*':          c1 = a1 * a2;          c2 = b1 * b2;          PrintFraction(c1, c2);          printf("\n");          break;      case '/':          c1 = a1 * b2;          c2 = b1 * a2;          if(c2 < 0) {     //确保PrintFraction函数的b是正数              c2 = -c2;              c1 = -c1;          }          PrintFraction(c1, c2);          printf("\n");          break;      }  }  int main() {      long long a1, b1, a2, b2;      scanf("%lld/%lld %lld/%lld", &a1, &b1, &a2, &b2);      Print(a1, b1, a2, b2, '+');      Print(a1, b1, a2, b2, '-');      Print(a1, b1, a2, b2, '*');      Print(a1, b1, a2, b2, '/');      return 0;  }  

题目链接:

https://www.patest.cn/contests/pat-b-practise/1034

0 0
原创粉丝点击