1034. 有理数四则运算
2016-02-14 20:59
204 查看
本题要求编写程序,计算2个有理数的和、差、积、商。
输入格式:
输入在一行中按照“a1/b1 a2/b2”的格式给出两个分数形式的有理数,其中分子和分母全是整型范围内的整数,负号只可能出现在分子前,分母不为0。
输出格式:
分别在4行中按照“有理数1 运算符 有理数2 = 结果”的格式顺序输出2个有理数的和、差、积、商。注意输出的每个有理数必须是该有理数的最简形式“k a/b”,其中k是整数部分,a/b是最简分数部分;若为负数,则须加括号;若除法分母为0,则输出“Inf”。题目保证正确的输出中没有超过整型范围的整数。
输入样例1:
输出样例1:
输入样例2:
输出样例2:
算法:
算法开始。
分别读取四个数字。
进行加减乘除运算,得到结果。
将假分数化简为最简带分数,将真分数化为最简真分数。
输出加减乘除四个运算。除法,若除数为零,则结果为Inf。
算法结束。
注意:由于题目未限制整数大小,所以应该把分子、分母变量设为long long,即占8个字节。否则PAT上有的测试用例会出错。
输入格式:
输入在一行中按照“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
算法:
算法开始。
分别读取四个数字。
进行加减乘除运算,得到结果。
将假分数化简为最简带分数,将真分数化为最简真分数。
输出加减乘除四个运算。除法,若除数为零,则结果为Inf。
算法结束。
注意:由于题目未限制整数大小,所以应该把分子、分母变量设为long long,即占8个字节。否则PAT上有的测试用例会出错。
#include <stdio.h> #include <stdlib.h> #include <math.h> #define MAX 1000 typedef struct fraction{ long long n; long long a; long long b; } fraction; fraction convert(fraction); void print(fraction v3, char operator, fraction v4, fraction result); void print_fraction(fraction v); long long greatest_common_divisor(long long a, long long b); int main(int argc, const char * argv[]) { fraction v1={0}, v2={0}, result={0}, v3={0}, v4={0}; scanf("%lld/%lld %lld/%lld", &(v1.a), &(v1.b), &(v2.a), &(v2.b)); result.a=v1.a*v2.b+v2.a*v1.b; result.b=v1.b*v2.b; result=convert(result); v3=convert(v1); v4=convert(v2); print(v3, '+', v4, result); putchar('\n'); result.a=v1.a*v2.b-v2.a*v1.b; result.b=v1.b*v2.b; result=convert(result); print(v3, '-', v4, result); putchar('\n'); result.a=v1.a*v2.a; result.b=v1.b*v2.b; result=convert(result); print(v3, '*', v4, result); putchar('\n'); result.a=v1.a*v2.b; result.b=v1.b*v2.a; result=convert(result); print(v3, '/', v4, result); return 0; } fraction convert(fraction f){ long long div=0; fraction tmp={0}; if(f.a<0){ tmp.a=-f.a; } else{ tmp.a=f.a; } if(f.b<0){ tmp.b=-f.b; } else{ tmp.b=f.b; } if(tmp.a*tmp.b){ div=greatest_common_divisor(tmp.a,tmp.b); tmp.a/=div; tmp.b/=div; } if(tmp.b){ tmp.n=tmp.a/tmp.b; tmp.a=tmp.a%tmp.b; if((f.a>=0)^(f.b>=0)){ if(tmp.n){ tmp.n*=-1; } else{ tmp.a*=-1; } } } else{ tmp.n=0; tmp.a=0; tmp.b=0; } return tmp; } long long greatest_common_divisor(long long a, long long b){ long long i; while(a%b!=0){ i=a%b; a=b; b=i; } return b; } void print(fraction v3, char c, fraction v4, fraction result){ print_fraction(v3); printf(" %c ", c); print_fraction(v4); printf(" = "); print_fraction(result); return ; } void print_fraction(fraction v){ if(v.n<0){ if(v.a==0){ printf("(%lld)", v.n); } else{ printf("(%lld %lld/%lld)", v.n, v.a, v.b); } } else if(v.n==0){ if(v.a==0){ if(v.b){ printf("%lld", v.n); } else{ printf("Inf"); } } else if(v.a>0){ printf("%lld/%lld", v.a, v.b); } else if(v.a<0){ printf("(%lld/%lld)", v.a, v.b); } } else if(v.n>0){ if(v.a==0){ printf("%lld", v.n); } else if(v.a>0){ printf("%lld %lld/%lld", v.n, v.a, v.b); } } return ; }
相关文章推荐
- 仿新闻图片浏览
- 蓝桥杯-开心的金明
- [Maven-不忘初心,方得始终] Maven-项目管理与构建
- 部署 Office Web Apps(3) - wopi host
- Android超类
- SpringMVC综合使用手机管理系统Controller层开发
- 出错函数用例
- 通用块设备驱动程序框架分析
- iOS面试题一
- 【机房重构】——数据库设计
- opencv分水岭算法对图像进行切割
- android JSON解析之JSONObject与GSON
- DHCP配置
- eleclp函数实例
- 一道常被人轻视的前端JS面试题
- InterlliJ调试:Method breakpoints may dramatically slow down debugging
- 如何正确的启动或停止SQL Server数据库引擎
- 部署 Office Web Apps(2)
- mvc路由htaccess,基本是apache服务,php命名空间
- git 收集