转跳点:

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

本题要求编写程序,计算 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

  这道题比较麻烦,因为需要考虑的东西较多所以,容易少考虑一些情况。

    1、我们需要考虑两个分数化简之后分母为0的不合法的情况。

    2、存在异号的时候,考虑符号的输出和异号的判断(千万别相乘小于0,这玩意会炸long long都塞不下,除非你想用大数运算,同余模好像也行)

    3、假分数要化成带分数,整数部分记得有空格

    4、括号输出,这玩意和负号共存,置一个flag,为1时输出(-1,最后要结束的时候宅检查一遍flag用于输出 )

    5、要注意PTA上gcc的C评测机的long long只有32位,所以gcc的C怎么提交都会出错(好吧,我比较懒,不想在想其他方法了,这也是我无意之中交错的时候发现的)

第五点是错的,我当时浅显的认为是评测机的问题 U•ェ•*U

大佬们,给个AC的C语言代码呗

AC代码:

 1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <math.h>
4
5 long long GCD(long long x, long long y) { return (0 == y) ? x : GCD(y, x % y); }
6 void Simplify(long long Molecule, long long Denominator);
7
8 int main(void)
9 {
10
11 long long DivdMoce, DivdDenom, DivsMoce, DivsDenom;
12
13 scanf("%lld/%lld %lld/%lld", &DivdMoce, &DivdDenom, &DivsMoce, &DivsDenom);
14  
15 Simplify(DivdMoce, DivdDenom); printf(" + "); Simplify(DivsMoce, DivsDenom); printf(" = "); Simplify(DivdMoce * DivsDenom + DivdDenom * DivsMoce, DivdDenom * DivsDenom); printf("\n");
16 Simplify(DivdMoce, DivdDenom); printf(" - "); Simplify(DivsMoce, DivsDenom); printf(" = "); Simplify(DivdMoce * DivsDenom - DivdDenom * DivsMoce, DivdDenom * DivsDenom); printf("\n");
17 Simplify(DivdMoce, DivdDenom); printf(" * "); Simplify(DivsMoce, DivsDenom); printf(" = "); Simplify(DivdMoce * DivsMoce, DivdDenom * DivsDenom); printf("\n");
18 Simplify(DivdMoce, DivdDenom); printf(" / "); Simplify(DivsMoce, DivsDenom); printf(" = "); Simplify(DivdMoce * DivsDenom, DivdDenom * DivsMoce);
19
20 return 0;
21 }
22
23 void Simplify(long long Molecule, long long Denominator)
24 {
25 //分母是否合法
26 if (0 == Molecule * Denominator)
27 {
28 printf("%s", 0 == Denominator ? "Inf" : "0");
29 return;
30 }
31
32 //正负号判定
33 int flag = ((Molecule > 0 && Denominator < 0) || (Molecule < 0 && Denominator > 0));
34 //先输出符号
35 printf("%s", 0 == flag ? "" : "(-");
36
37 //去除符号问题,简化最大公约数求取过程
38 Molecule = abs(Molecule);
39 Denominator = abs(Denominator);
40
41 //获取商,准备输出带分数整数部分
42 long long Interger = Molecule / Denominator;
43 //如果是假分数,那么化为带分数并输出整数部分
44 if (0 != Interger)
45 {
46 printf("%lld", Interger);
47 }
48 //检测能否被整除
49 if (0 == Molecule % Denominator)
50 {
51 if (1 == flag)
52 {
53 printf(")");
54 }
55 return;
56 }
57 //补上带分数正整数部分的空格
58 if (0 != Interger)
59 {
60 printf(" ");
61 }
62
63 Molecule = Molecule - Denominator * Interger;
64 long long gcd = GCD(Molecule, Denominator);
65
66 printf("%lld/%lld%s", Molecule / gcd, Denominator / gcd, 1 == flag ? ")" : "");
67 }

  记得用C++提交

   刚刚,小姐姐说我太懒了,嗯,赶紧改正,我写了一份C的AC代码,可以用GCC 的 C 交,而且我知道为什么原本的会错了,

上一个版本我用了abs,这个函数只能返回 int 大小的数据,所以返回后导致精度丢失,导致结果错误。

这是C语言AC的代码

#include <stdio.h>

long long GCD(long x, long y) { return (0 == y) ? x : GCD(y, x % y); }
long Simplify(long Molecule, long Denominator); int main(void)
{
long DivdMoce, DivdDenom, DivsMoce, DivsDenom;
scanf("%ld/%ld %ld/%ld", &DivdMoce, &DivdDenom, &DivsMoce, &DivsDenom); Simplify(DivdMoce, DivdDenom);printf(" + ");Simplify(DivsMoce, DivsDenom);printf(" = ");Simplify(DivdMoce * DivsDenom + DivsMoce * DivdDenom, DivdDenom * DivsDenom);printf("\n");
Simplify(DivdMoce, DivdDenom);printf(" - ");Simplify(DivsMoce, DivsDenom);printf(" = ");Simplify(DivdMoce * DivsDenom - DivsMoce * DivdDenom, DivdDenom * DivsDenom);printf("\n");
Simplify(DivdMoce, DivdDenom);printf(" * ");Simplify(DivsMoce, DivsDenom);printf(" = ");Simplify(DivdMoce * DivsMoce, DivdDenom * DivsDenom);printf("\n");
Simplify(DivdMoce, DivdDenom);printf(" / ");Simplify(DivsMoce, DivsDenom);printf(" = ");Simplify(DivdMoce * DivsDenom, DivdDenom * DivsMoce);
return 0;
}
/**
* 非递归版辗转相除法(a>b)
long GCD(long Molecule, long Denominator)
{ //辗转相除法求最大公约数
long gcd = Molecule % Denominator;
while (gcd != 0)
{
Molecule = Denominator;
Denominator = gcd;
gcd = Molecule % Denominator;
}
return Denominator;
}
**/
long Simplify(long Molecule, long Denominator)
{
if (Denominator == 0)
{
printf("Inf");
return 0;
} //符号判断
int flag = 1;
//确定符号,取绝对值,避开abs
if (Denominator < 0)
{
Denominator *= -1;
flag *= -1;
}
if (Molecule < 0)
{
Molecule = -Molecule;
flag *= -1;
} if (flag == -1)
{
printf("(-");
} //约分为最简分数
long gcd = GCD(Molecule, Denominator);
Molecule = Molecule / gcd;
Denominator = Denominator / gcd; if (1 == Denominator)
{ //假分数
printf("%ld", Molecule);
}
else if (Molecule < Denominator)
{ //正常分数
printf("%ld/%ld", Molecule, Denominator);
}
else if (Molecule > Denominator)
{ //带分数
printf("%ld %ld/%ld", Molecule / Denominator, Molecule % Denominator, Denominator);
}
if (flag == -1)
{
printf(")");
}
return 0;
}

PTA不易,诸君共勉!

P 1034 有理数四则运算的更多相关文章

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

    1034. 有理数四则运算(20) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 本题要求编写程序,计算2个有理 ...

  2. PAT 1034 有理数四则运算(20)(代码框架+思路+测试点错误分析)

    1034 有理数四则运算(20)(20 分)提问 本题要求编写程序,计算2个有理数的和.差.积.商. 输入格式: 输入在一行中按照"a1/b1 a2/b2"的格式给出两个分数形式的 ...

  3. PAT (Basic Level) Practise (中文)-1034. 有理数四则运算(20)

    PAT (Basic Level) Practise (中文)-1034. 有理数四则运算(20)  http://www.patest.cn/contests/pat-b-practise/1034 ...

  4. PAT(B) 1034 有理数四则运算(Java)

    题目链接:1034 有理数四则运算 (20 point(s)) 题目描述 本题要求编写程序,计算 2 个有理数的和.差.积.商. 输入格式 输入在一行中按照 a1/b1 a2/b2 的格式给出两个分数 ...

  5. PAT——1034. 有理数四则运算

    本题要求编写程序,计算2个有理数的和.差.积.商. 输入格式: 输入在一行中按照“a1/b1 a2/b2”的格式给出两个分数形式的有理数,其中分子和分母全是整型范围内的整数,负号只可能出现在分子前,分 ...

  6. PAT 1034. 有理数四则运算(20)

    本题要求编写程序,计算2个有理数的和.差.积.商. 输入格式: 输入在一行中按照"a1/b1 a2/b2"的格式给出两个分数形式的有理数,其中分子和分母全是整型范围内的整数,负号只 ...

  7. PAT乙级1034. 有理数四则运算(20)

    本题要求编写程序,计算2个有理数的和.差.积.商. 输入格式: 输入在一行中按照“a1/b1 a2/b2”的格式给出两个分数形式的有理数,其中分子和分母全是整型范围内的整数,负号只可能出现在分子前,分 ...

  8. PAT 1034 有理数四则运算

    https://pintia.cn/problem-sets/994805260223102976/problems/994805287624491008 本题要求编写程序,计算2个有理数的和.差.积 ...

  9. 1034 有理数四则运算 (20 分)C语言

    题目描述 本题要求编写程序,计算2个有理数的和.差.积.商. 输入描述: 输入在一行中按照"a1/b1 a2/b2"的格式给出两个分数形式的有理数,其中分子和分母全是整型范围内的整 ...

随机推荐

  1. [经验] 使用 jQuery+JSON 实现国际化

    技术选型关键词:  [spring boot] [jQuery] [JSON] [JSP] 前言: 关于国际化, 我在一开始的时候就有一个误解, 我认为所谓国际化就是编写一段高技术含量的代码, 然后这 ...

  2. Day3-L-Cup HDU2289

    The WHU ACM Team has a big cup, with which every member drinks water. Now, we know the volume of the ...

  3. java核心-多线程(6)-线程池-ThreadPoolExecutor

    1.java多线程编程少不了使用线程池,线程池相关的工具类所在jdk包,java.util.concurrent 2.使用示例 demo1 public class ThreadPoolDemo { ...

  4. 本地VMware虚拟机环境CentOS7.6 安装宝塔Linux面板

    之前测试一直都在使用phpenv和phpstudy ,不过这两个集成环境时长容易出bug,各种问题劝退.之前Windows开始Linux的体验又不尽人意,今天介绍一个别的方法.VMware安装Linu ...

  5. javascript中,对象本身就是一种Map结构。

    var map = {}; map['key1'] = 1; map['key2@'] = 2;   console.log(map['key1']);//结果是1. console.log(map[ ...

  6. Day3:关于地形生成

    ---恢复内容开始--- 今天桃子好像还是没什么动静,不过媳妇倒是有一点见红~ 希望这是马上要出来的前兆了~ 桃子都已经晃点我俩好多回了~ 已经都快习惯来她这个狼来了的征兆了~ ----------- ...

  7. i春秋-百度杯九月场-YeserCMS(cmseasy的UpdateXML注入漏洞)

    学习了大佬们的操作才做出来,记录一次菜鸡的无能为力. tips:flag在网站根目录下的flag.php中.我们的目标就是flag.php了. 题目说是心的CMS:YeserCMS,然而百度一下,出来 ...

  8. NO24 第三关--企业面试题

    [考试目的] 1.学生课后复习及预习情况. 2.未来实际工作中做人做事能力. 3.沟通及口头表达能力. [口头表达技能考试题] 1.描述linux的开机到登陆界面的启动过程(记时2分钟) *****L ...

  9. 【转载】Jmeter关联-正则表达式提取器

            今天研发同事提供了一个验证token的接口,要验证token的正确性,现在将整个过程做如下记录: 场景:验证token的正确性 原理:首先用户登录成功后,会在Response head ...

  10. 编程题:求单链表倒数第k位的值(最后一位为倒数第0位)好未来

    #!/usr/bin/env python class Node(object): def __init__(self,elem,next_=None): self.elem = elem self. ...