PAT乙级1034有理数四则运算

2024-02-14 15:18

本文主要是介绍PAT乙级1034有理数四则运算,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目描述:
本题要求编写程序,计算 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 <cmath>
using namespace std;
long gcd(long int a, long int b) {return b == 0 ? a : gcd(b, a % b);}
void func(long int a,long int b)
{long int c=0,m=gcd(abs(a),abs(b));if(b!=0) c=a/b;else {cout<<"Inf";return;}if(a==0){cout<<"0";return;}a-=c*b;if(c<0) a=-a;b/=m;a/=m;if(a==0) c>=0?printf("%ld",c):printf("(%ld)",c);else if(c==0) a*b>0?printf("%ld/%ld",a,b):(b>0?printf("(%ld/%ld)",a,b):printf("(%ld/%ld)",-a,-b));else c>=0?printf("%ld %ld/%ld",c,a,b):printf("(%ld %ld/%ld)",c,a,b);
}
int main()
{long int a1,b1,a2,b2;scanf("%ld/%ld %ld/%ld",&a1,&b1,&a2,&b2);func(a1,b1); printf(" + ");func(a2,b2);printf(" = ");func(a1*b2+a2*b1,b1*b2);printf("\n");func(a1,b1); printf(" - ");func(a2,b2);printf(" = ");func(a1*b2-a2*b1,b1*b2);printf("\n");func(a1,b1); printf(" * ");func(a2,b2);printf(" = ");func(a1*a2,b1*b2);printf("\n");func(a1,b1); printf(" / ");func(a2,b2);printf(" = ");func(a1*b2,b1*a2);printf("\n");return 0;
}

来总结一下:
1)定义变量应该定义为长整型(long int),要不然测试过不去。
2)gcd求最大公约数的函数,应该求的是两个正数的最大公约数,所以要用abs()函数。
3)多重判断其实可以用嵌套的条件运算符。
4)像这种输入的数中有字符又有数字,而我们只要数字的时候,还是用scanf好一些,string类虽然也可以但是还要截取和转化,麻烦不少。

这篇关于PAT乙级1034有理数四则运算的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/708853

相关文章

PAT甲级-1044 Shopping in Mars

题目   题目大意 一串项链上有n个钻石,输入给出每个钻石的价格。用m元买一个连续的项链子串(子串长度可为1),如果不能恰好花掉m元,就要找到最小的大于m的子串,如果有重复就输出多个,按递增顺序输出子串的前端和后端索引。 原来的思路 取连续的子串使和恰等于m,没有恰等于就找最小的大于。可以将子串依次累加,使得每个位置都是起始位置到该位置的序列和,整个数组显递增顺序,就可以用右边减左边

PAT (Advanced Level) Practice——1011,1012

1011:  链接: 1011 World Cup Betting - PAT (Advanced Level) Practice (pintia.cn) 题意及解题思路: 简单来说就是给你3行数字,每一行都是按照W,T,L的顺序给出相应的赔率。我们需要找到每一行的W,T,L当中最大的一个数,累乘的结果再乘以0.65,按照例子写出表达式即可。 同时还需要记录每一次选择的是W,T还是L

四则运算-栈方法 JAVA

栈的规则是先进后出。利用压栈的思想来计算四则运算表达式方法如下:创建两个栈,一个存放四则表达式的数字,另一个存放对应的操作符。 例如一个表达是(3-1)*6-8/4,那么就将这个表达是的数字和操作符分别压入各自的栈,压栈规则如下: 1>遇到数字则直接压入数字栈顶; 2>遇到运算符(+-*/)时,若操作符栈为空,则直接放入操作符栈顶,否则,见3; 3>若操作符栈顶元素的优先级比当前运算符的优

Java实现简单四则运算

工作之余,突然想用java实现一下四则运算,经过简单的构思,很快就有了思路,就完成了一个简单版本。   经过慎重考虑,觉得使用栈还是要比数组或者List容易对符号和数字进行控制。 我使用两个栈,分别保存数字和符号,然后判断当前符号和前一个符号的运算级别,来决定是否进行一次弹栈运算(就是挨着前一个运算符号的两个数,是不是有必要进行一次运算)。 经过简单的测试,标准的四则运算,在下面代码是没有

PAT (Advanced Level) Practice

1001:  题目大意: 计算 a+b 的结果,并以标准格式输出——即每三个数字一组,组之间用逗号分隔(如果数字少于四位,则不需要逗号分隔)  解析: 我们知道相加右正有负,对于样例来说 Sample Input: -1000000 9 Sample Output: -999,991 如果是从左往右,算上负号的话输出应该是-99,999,1 从右往左:-,999,991离正确

1034 forest

大水题,WA到吐了,结果发现犯了一弱智错误,擦 1.定义dept[]数组,主要用bfs ,将子节点的dept值累加父节点的dept值,遍历一颗或者若干树。从根节点(bepointed[]值为false的点)出发遍历全棵树。 2.存储方式:邻接表存边 vector+queue  , #include <iostream>#include<queue>#include<vector>

【Java实现经典算法】有理数四则运算

题目描述 本题要求编写程序,计算2个有理数的和、差、积、商。 输入描述: 输入在一行中按照“a1/b1 a2/b2”的格式给出两个分数形式的有理数,其中分子和分母全是整型范围内的整数,负号只可能出现在分子前,分母不为0。 输出描述: 分别在4行中按照“有理数1 运算符 有理数2 = 结果”的格式顺序输出2个有理数的和、差、积、商。注意输出的每个有理数必须是该有理数的最简形式“k a/

1050 String Subtraction——PAT甲级

Given two strings S1​ and S2​, S=S1​−S2​ is defined to be the remaining string after taking all the characters in S2​ from S1​. Your task is simply to calculate S1​−S2​ for any given strings. However,

位操作实现加减乘除四则运算

常见的位操作实现 1. 常用的一个等式:-n = ~(n - 1) = ~n + 1 2. 获取整数的二进制的最右边的1:n & (-n) 或 n & ~(n - 1)。例如 n = 010100, -n = 101100,那么n & (-n) = 000100 3. 去除整数的二进制的最右边的1:n & (n - 1)。例如 n = 010100,n-1 = 010011,n&(n-1)

洛阳送变电工程设计乙级资质申请流程方法

一、前期准备 确认资质申请条件:查阅最新的《电力行业送变电工程设计企业资质标准》和地方相关政策。 确认企业的注册资金、技术人员配置、办公场所、技术装备等是否符合资质标准的要求。 组织技术人员:配置齐全合理的专业技术人员,包括但不限于: 注册电气工程师(发输变电)若干名 二级/一级注册结构工程师 二级注册建筑师 给排水、暖通中级工程师各至少一名 电力系统、通信保护、概预算、总图高级工