PAT Basic 1034. 有理数四则运算(20)(C语言实现)
来源:互联网 发布:新型网络犯罪问题研究 编辑:程序博客网 时间:2024/05/17 04:14
题目
本题要求编写程序,计算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
思路
这道题的注意点就是分数的约分和表示。
- 题目限定了输入输出都不超过整型范围,那么当我们计算两个分数的加减乘除时,分子分母就应该不超过长整形范围:
- 极限情况就是两者之和/之差的分子为
- 极限情况就是两者之和/之差的分子为
- 输出形式共有3种:
- 假分数,输出整数部分和真分数部分;
- 真分数,只输出真分数部分;
- 整数,只输出整数部分。
- 在判断输出的正负号时,如果分子分母还没有约分,那么小心使用两者之积来判断符号,因为已经溢出长整形范围。
代码
最新代码@github,欢迎交流 ^_^
#include <stdio.h>/* take all positive values as params */long calcgcd(long a, long b){ long r; while((r = a % b)) { a = b; b = r; } return b;}/* print a fraction number, giving the numerator and dominator */void printfrac(long n, long d){ if(d == 0) { printf("Inf"); return; } /* record the sign and make them positive */ int inegative = 1; if(n < 0) { n = -n; inegative *= -1; } if(d < 0) { d = -d; inegative *= -1; } /* reduce the fraction */ long gcd = calcgcd(n, d); n /= gcd; d /= gcd; /* print */ if(inegative == -1) printf("(-"); if(n / d && n % d) printf("%ld %ld/%ld", n / d, n % d, d); /* mixed fractions */ else if(n % d) printf("%ld/%ld", n % d, d); /* proper fractions */ else printf("%ld", n / d); /* integers */ if(inegative == -1) printf(")");}int main(){ long a1, b1, a2, b2; scanf("%ld/%ld %ld/%ld", &a1, &b1, &a2, &b2); char op[4] = {'+', '-', '*', '/'}; for(int i = 0; i < 4; i++) { printfrac(a1, b1); printf(" %c ", op[i]); printfrac(a2, b2); printf(" = "); switch(op[i]) { case '+': printfrac(a1 * b2 + a2 * b1, b1 * b2); break; case '-': printfrac(a1 * b2 - a2 * b1, b1 * b2); break; case '*': printfrac(a1 * a2, b1 * b2); break; case '/': printfrac(a1 * b2, b1 * a2); break; } printf("\n"); } return 0;}
阅读全文
0 0
- PAT Basic 1034. 有理数四则运算(20)(C语言实现)
- PAT (Basic Level) Practise (中文)1034. 有理数四则运算(20) C语言
- PAT BASIC LEVEL 1034. 有理数四则运算(20)
- PAT (Basic Level) Practise (中文) 1034. 有理数四则运算(20)
- PAT (Basic Level) Practise (中文)1034. 有理数四则运算(20)
- PAT (Basic Level)1034. 有理数四则运算
- PAT Basic 1034 有理数四则运算(20)
- PAT Basic 1034 有理数四则运算(20)
- PAT(basic level) 1034 有理数四则运算(20)
- 【PAT】1034. 有理数四则运算(20)
- 1034. 有理数四则运算(20) PAT
- PAT 1034. 有理数四则运算(20)
- Pat(Basic Level)Practice--1034(有理数四则运算)
- PAT-乙级-1034. 有理数四则运算(20)
- C++ - PAT - 1034. 有理数四则运算(20)
- PAT乙级.1034. 有理数四则运算(20)
- PAT 乙级 1034. 有理数四则运算(20)
- PAT-B 1034. 有理数四则运算(20)
- PAT Basic 1030. 完美数列(25)(C语言实现)
- [PAT-乙级]1059.C语言竞赛
- PAT Basic 1031. 查验身份证(15)(C语言实现)
- PAT Basic 1032. 挖掘机技术哪家强(20)(C语言实现)
- PAT Basic 1033. 旧键盘打字(20)(C语言实现)
- PAT Basic 1034. 有理数四则运算(20)(C语言实现)
- PAT Basic 1045. 快速排序(25)(C语言实现)
- zkui
- PAT Basic 1036. 跟奥巴马一起编程(15)(C语言实现)
- PAT Basic 1037. 在霍格沃茨找零钱(20)(C语言实现)
- 学习淘淘商城第七十一课(网页静态化-freemarker模板改造)
- PAT Basic 1038. 统计同成绩学生(20)(C语言实现)
- PAT Basic 1039. 到底买不买(20)(C语言实现)
- PAT Basic 1040. 有几个PAT(25)(C语言实现)