输入为两个分数,让你计算+,-,*,\四种结果,并且输出对应的式子,分数要按带分数的格式k a/b输出
如果为负数,则带分数两边要有括号
如果除数为0,则式子中的结果输出Inf
模拟题最好自己动手实现,考验细节处理,其它没啥好说的。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring> using namespace std;
long long numerator[];
long long denominator[];
long long GCD(long long a,long long b){
a=abs(a);
b=abs(b);
if(b==)
return a;
return GCD(b,a%b); }
struct Fraction{
long long integer;
long long numerator;
long long denominator;
}frac[];
/**
转化成带分数的形式
*/
void transfer(long long numerator,long long denominator,int i){
//long long gcd=GCD(numerator,denominator);
//numerator=numerator/gcd;
//denominator=denominator/gcd;
frac[i].integer=numerator/denominator;
frac[i].numerator=numerator%denominator;
frac[i].denominator=denominator;
}
/**
输出,如果为负数还要有括号
*/
void print(Fraction f){
if(f.integer!=){
if(f.integer<)
printf("(");
printf("%lld",f.integer);
} if(f.numerator!=){
if(f.integer!=){
printf(" ");
}
//如果前面整数部分为0,则这里需要加(
else if(f.numerator<)
printf("(-");
//注意,如果是负数,只要整数前面一个'-'就可以,所以这里不需要'-'
if(f.numerator>)
printf("%lld/%lld",f.numerator,f.denominator);
else
printf("%lld/%lld",-f.numerator,f.denominator);
}
if(f.integer==&&f.numerator==)
printf("");
else if(f.integer< || f.numerator<)
printf(")"); //末尾补)
} int main()
{
long long res;
scanf("%lld/%lld %lld/%lld",&numerator[],&denominator[],&numerator[],&denominator[]);
//先约分
long long gcd0=GCD(numerator[],denominator[]);
numerator[]=numerator[]/gcd0;
denominator[]=denominator[]/gcd0;
long long gcd1=GCD(numerator[],denominator[]); numerator[]=numerator[]/gcd1;
denominator[]=denominator[]/gcd1; long long gcd=GCD(denominator[],denominator[]);
long long lcm=(denominator[]/gcd)*gcd*(denominator[]/gcd);
transfer(numerator[],denominator[],);
transfer(numerator[],denominator[],);
//sum
long long sum=numerator[]*(lcm/denominator[])+numerator[]*(lcm/denominator[]);
long long gcd2=abs(GCD(sum,lcm));
transfer(sum/gcd2,lcm/gcd2,);
print(frac[]);
printf(" + ");
print(frac[]);
printf(" = ");
print(frac[]);
printf("\n"); //difference
sum=numerator[]*(lcm/denominator[])-numerator[]*(lcm/denominator[]);
gcd2=abs(GCD(sum,lcm));
transfer(sum/gcd2,lcm/gcd2,);
print(frac[]);
printf(" - ");
print(frac[]);
printf(" = ");
print(frac[]);
printf("\n"); //product
sum=numerator[]*numerator[];
res=denominator[]*denominator[];
gcd2=abs(GCD(sum,res));
transfer(sum/gcd2,res/gcd2,);
print(frac[]);
printf(" * ");
print(frac[]);
printf(" = ");
print(frac[]);
printf("\n"); //quotient
print(frac[]);
printf(" / ");
print(frac[]);
printf(" = ");
if(numerator[]==){
printf("Inf\n");
}
else{
sum=numerator[]*denominator[];
res=denominator[]*numerator[];
if(res<){
sum=-sum;
res=-res;
} gcd2=abs(GCD(sum,res));
transfer(sum/gcd2,res/gcd2,); print(frac[]);
printf("\n");
} return ;
}

PAT甲题题解-1088. Rational Arithmetic (20)-模拟分数计算的更多相关文章

  1. PAT甲题题解-1081. Rational Sum (20)-模拟分数计算

    模拟计算一些分数的和,结果以带分数的形式输出注意一些细节即可 #include <iostream> #include <cstdio> #include <algori ...

  2. PAT甲题题解-1042. Shuffling Machine (20)-模拟

    博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/6789205.html特别不喜欢那些随便转载别人的原创文章又不给 ...

  3. PAT甲题题解-1041. Be Unique (20)-水题

    博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/6789189.html特别不喜欢那些随便转载别人的原创文章又不给 ...

  4. PAT甲题题解-1050. String Subtraction (20)-水题

    #include <iostream> #include <cstdio> #include <string.h> #include <algorithm&g ...

  5. PAT甲题题解-1096. Consecutive Factors(20)-(枚举)

    题意:一个正整数n可以分解成一系列因子的乘积,其中会存在连续的因子相乘,如630=3*5*6*7,5*6*7即为连续的因子.给定n,让你求最大的连续因子个数,并且输出其中最小的连续序列. 比如一个数可 ...

  6. PAT甲题题解-1108. Finding Average (20)-字符串处理

    求给出数的平均数,当然有些是不符合格式的,要输出该数不是合法的. 这里我写了函数来判断是否符合题目要求的数字,有点麻烦. #include <iostream> #include < ...

  7. PAT甲题题解-1120. Friend Numbers (20)-水题

    博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/6789775.html特别不喜欢那些随便转载别人的原创文章又不给 ...

  8. PAT甲题题解-1015. Reversible Primes (20)-素数

    先判断n是否为素数然后把n转化成d进制下再反转,转化为十进制的num判断num是否为素数 注意n为0和1时,不是素数!!!注意反转后的num也有可能为1,不是素数!!! #include <io ...

  9. PAT甲题题解-1046. Shortest Distance (20)-做了一个假的最短路,水

    一开始以为是最短路,结果是给你一个环,让你求环上两点之间的距离...那还做毛线 然而还是得做毛线 #include <iostream> #include <cstdio> # ...

随机推荐

  1. 【11】python 递归,深度优先搜索与广度优先搜索算法模拟实现

    一.递归原理小案例分析 (1)# 概述 递归:即一个函数调用了自身,即实现了递归 凡是循环能做到的事,递归一般都能做到! (2)# 写递归的过程 1.写出临界条件 2.找出这一次和上一次关系 3.假设 ...

  2. webstorm 搭建es6开发环境

    本文转自:http://www.jianshu.com/p/26601581e152 1:新建一个Empty Project项目es6 ,然后在src目录下新建了一个es.js: 2:打开设置pref ...

  3. 快速数论变换(NTT)

    刚学完FFT,干脆把NTT也学了算了 (一)预备知识 关于原根,这里说得蛮详细的百度百科 为什么使用原根呢?为什么原根可以替代\(\omega_{n}\)呢?想知道为什么就看here NTT用到的各种 ...

  4. 流式套接字:基于TCP协议的Socket网络编程(案例2)

    案例:在案例1的基础上实现一个服务器对应多个客户端(多线程),且获得每个客户端的IP. 线程代码: package com.yh.mySocket; import java.io.BufferedRe ...

  5. 三、并行编程 - Task同步机制。TreadLocal类、Lock、Interlocked、Synchronization、ConcurrentQueue以及Barrier等

    在并行计算中,不可避免的会碰到多个任务共享变量,实例,集合.虽然task自带了两个方法:task.ContinueWith()和Task.Factory.ContinueWhenAll()来实现任务串 ...

  6. MetaMask/eth-block-tracker

    https://github.com/MetaMask/eth-block-tracker A JS module for keeping track of the latest Ethereum b ...

  7. Kubernetes1.91(K8s)安装部署过程(一)--证书安装

    安装前忠告:如果你用的是虚拟机,强烈不建议你使用克隆(链接克隆)的方式,至于完整克隆不知道有没有问题,每一台全新安装centos7系统最好. 一.安装前主题环境准备 1.docker安装 建议使用官网 ...

  8. SystemView SEGGER FreeRTOS 移植和使用

    /* 官方帮助英文翻译文档参考:https://blog.csdn.net/bjr2016/article/category/7275877. */ /* 移植文档参考:https://blog.cs ...

  9. linux找到目录下所有目录文件

    想要删除掉该目录下的所有文件类型是目录的文件? 这样运行: $ ls -F | grep /$ | xargs rm -rf ls 中F参数,作用是能把目录文件的名字后边加上一个斜杠/ 然后匹配以斜杠 ...

  10. mysql,int(5)、int(10)啥区别联系

    实际没啥区别..这个5和10并不是最大5位,最大10位的意思. 好比选择了int(5),并且当你选择了0填充的话.你的数据假设存了123,那么你的显示会是00123,(有些操作mysql的工具看不出来 ...