本题要求编写程序,计算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 这题WA了好久,卡在LL这里......大致思路就是通分之后要约分,然后将约分之后的这个数转成一个真分数的形式
//ll WA #include <bits/stdc++.h> #define LL long long using namespace std; void convert(LL a, LL b); int main(){ LL a1, b1, a2, b2; scanf("%lld/%lld%lld/%lld", &a1, &b1, &a2, &b2); //+ convert(a1, b1); printf(" + "); convert(a2, b2); printf(" = "); convert(a1*b2+a2*b1, b1*b2); printf("\n"); //- convert(a1, b1); printf(" - "); convert(a2, b2); printf(" = "); convert(a1*b2-a2*b1, b1*b2); printf("\n"); //* convert(a1, b1); printf(" * "); convert(a2, b2); printf(" = "); convert(a1*a2, b1*b2); printf("\n"); // / convert(a1, b1); printf(" / "); convert(a2, b2); printf(" = "); if(a2 == 0){ printf("Inf\n"); } else{ convert(a1*b2, a2*b1); printf("\n"); } return 0; } void convert(LL a, LL b){ if(a > 0 && b < 0){ a = -a; b = -b; } else if(a < 0 && b < 0){ a = -a; b = -b; } // a = b*k if(a % b == 0){ if(a < 0){ printf("(%lld)", a/b); } else{ printf("%lld", a/b); } return; } //otherwise //simplify for(int i = 2; i <= sqrt(max(a,b)); ++i){ while(a % i == 0 && b % i == 0){ a /= i; b /= i; } } if(a < 0){ //- if(a / b != 0){ printf("(%lld %lld/%lld)", a/b, (abs(a))%b, b); } else{ printf("(%lld/%lld)", a, b); } } else{ //+ if(a / b != 0){ printf("%lld %lld/%lld", a/b, a%b, b); } else{ printf("%lld/%lld", a, b); } } }
CAPOUIS‘CODE
时间: 2024-10-07 02:58:28