1034 有理数四则运算 (20分)
Posted geyang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 #include<iostream> 2 #include<math.h> 3 #include <string> 4 using namespace std; 5 long long int gys(long long a,long long b){ 6 return b==0 ? a : gys(b,a%b); 7 } 8 void num1(long long a, long long b){ 9 10 if(b<0){ 11 a=-a; 12 b=-b; 13 } 14 long long c; 15 if(a==0){ 16 cout<<0; 17 }else if(abs(a)>abs(b)){ 18 if(a%b==0){ 19 c=a/b; 20 cout<<c; 21 }else{ 22 c=a/b; 23 cout<<c<<" "<<fabs(a%b)<<"/"<<b; 24 } 25 26 }else if(a%b==0){ 27 cout<<a/b; 28 }else 29 cout<<a<<"/"<<b; 30 } 31 32 int main(){ 33 long long a,b,a1,a2,b1,b2,c; 34 35 scanf("%lld/%lld %lld/%lld",&a1,&b1,&a2,&b2); 36 c=gys(a1,b1); 37 a1=a1/c; 38 b1=b1/c; 39 c=gys(a2,b2); 40 a2=a2/c; 41 b2=b2/c; 42 //加法 43 //输出第一个有理数 44 if((a1<0&&b1>0)||(a1>0&&b1<0)){ 45 cout<<"(";num1(a1,b1);cout<<")"; 46 }else 47 num1(a1,b1); 48 cout<<" + "; 49 //输出第二个有理数 50 if((a2<0&&b2>0)||(a2>0&&b2<0)){ 51 cout<<"(";num1(a2,b2);cout<<")"; 52 }else 53 num1(a2,b2); 54 //输出计算结果 55 a=a1*b2+a2*b1; 56 b=b1*b2; 57 c=gys(a,b); 58 a=a/c; 59 b=b/c; 60 if(b==0) 61 cout<<" = Inf"; 62 else if(a==0) 63 cout<<" = 0"; 64 else if((a<0&&b>0)||(a>0&&b<0)){ 65 cout<<" = (";num1(a,b);cout<<")"; 66 }else{ 67 cout<<" = "; 68 num1(a,b); 69 } 70 71 cout<<" "; 72 //减法 73 // 输入第一个有理数 74 if((a1<0&&b1>0)||(a1>0&&b1<0)){ 75 cout<<"(";num1(a1,b1);cout<<")"; 76 }else 77 num1(a1,b1); 78 cout<<" - "; 79 // 输入第二个有理数 80 if((a2<0&&b2>0)||(a2>0&&b2<0)){ 81 cout<<"(";num1(a2,b2);cout<<")"; 82 }else 83 num1(a2,b2); 84 a=a1*b2-a2*b1; 85 b=b1*b2; 86 c=gys(a,b); 87 a=a/c; 88 b=b/c; 89 if(b==0) 90 cout<<" = Inf"; 91 else if(a==0) 92 cout<<" = 0"; 93 else if((a<0&&b>0)||(a>0&&b<0)){ 94 cout<<" = (";num1(a,b);cout<<")"; 95 }else{ 96 cout<<" = "; 97 num1(a,b);} 98 cout<<" "; 99 //乘法 100 if((a1<0&&b1>0)||(a1>0&&b1<0)){ 101 cout<<"(";num1(a1,b1);cout<<")"; 102 }else 103 num1(a1,b1); 104 cout<<" * "; 105 if((a2<0&&b2>0)||(a2>0&&b2<0)){ 106 cout<<"(";num1(a2,b2);cout<<")"; 107 }else 108 num1(a2,b2); 109 a=a1*a2; 110 b=b1*b2; 111 c=gys(a,b); 112 a=a/c; 113 b=b/c; 114 if(b==0) 115 cout<<" = Inf"; 116 else if(a==0) 117 cout<<" = 0"; 118 else if((a<0&&b>0)||(a>0&&b<0)){ 119 cout<<" = (";num1(a,b);cout<<")"; 120 }else{ 121 cout<<" = "; 122 num1(a,b); } 123 cout<<" "; 124 //除法 125 if((a1<0&&b1>0)||(a1>0&&b1<0)){ 126 cout<<"(";num1(a1,b1);cout<<")"; 127 }else 128 num1(a1,b1); 129 cout<<" / "; 130 if((a2<0&&b2>0)||(a2>0&&b2<0)){ 131 cout<<"(";num1(a2,b2);cout<<")"; 132 }else 133 num1(a2,b2); 134 a=a1*b2;b=b1*a2; 135 c=gys(a,b); a=a/c;b=b/c; 136 if(b==0) 137 cout<<" = Inf"; 138 else if(a%b==0){ 139 cout<< " = "<<a/b; 140 } 141 else if(a==0) 142 cout<<" = 0"; 143 else if(a==b) 144 cout<<" = 1"; 145 else if((a<0&&b>0)||(a>0&&b<0)){ 146 cout<<" = (";num1(a,b);cout<<")"; 147 }else{ 148 cout<<" = "; 149 num1(a,b); 150 } 151 return 0; 152 }
以上是关于1034 有理数四则运算 (20分)的主要内容,如果未能解决你的问题,请参考以下文章