PTA basic 1034 有理数四则运算 (20 分) c语言实现(gcc 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
这题搞心态,测试点2 3 没通过,提交牛客网通过, 抄的大佬作业https://www.liuchuo.net/archives/492,没想通哪里不对
1 #include "stdio.h" 2 #include "stdlib.h" 3 #include "string.h" 4 #include "math.h" 5 //最简分数 6 //判定一个分数是不是最简分数,需要得到两个数的最小公约数,如果最大公约数是1,则是最简分数 7 //最大公约数要用碾除法求得 碾除法是 使用两个数中较大的那个数对较小的数取余,直到结果为0,其中较小的数就是最大公约数 8 9 long long maxDivisor(long long a,long long b){//最小公约数 要求都为正数 10 return b==0?a:maxDivisor(b, a%b); 11 } 12 13 14 //结果化简并输出 15 void simp_prin(long long a,long long b){ 16 //积是否为0或者除数是否为0 17 if(a*b==0){ 18 printf("%s",b==0?"Inf":"0"); 19 return; 20 } 21 //是否异号 22 int flag=((a>0&&b<0)||(a<0&&b>0)); 23 //取绝对值 24 a=abs(a);b=abs(b); 25 printf("%s",flag?"(-":""); 26 if(a/b!=0)printf("%lld",a/b); 27 if(a%b==0){ 28 if(flag)printf(")"); 29 return; 30 } 31 long maxdivi=maxDivisor(abs(a),abs(b)); 32 if(a/b!=0)printf(" "); 33 printf("%lld/%lld%s",(a%b)/maxdivi,b/maxdivi,flag?")":""); 34 } 35 36 int main(){ 37 long long a1,a2,b1,b2; 38 scanf("%lld/%lld %lld/%lld",&a1,&a2,&b1,&b2); 39 simp_prin(a1,a2);printf(" + ");simp_prin(b1, b2);printf(" = ");simp_prin(a1*b2+a2*b1, a2*b2);printf("\n"); 40 simp_prin(a1,a2);printf(" - ");simp_prin(b1, b2);printf(" = ");simp_prin(a1*b2-a2*b1, a2*b2);printf("\n"); 41 simp_prin(a1,a2);printf(" * ");simp_prin(b1, b2);printf(" = ");simp_prin(a1*b1, a2*b2);printf("\n"); 42 simp_prin(a1,a2);printf(" / ");simp_prin(b1, b2);printf(" = ");simp_prin(a1*b2, a2*b1); 43 return 0; 44 }