本题要求编写程序,计算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
#include <stdio.h> long long GCD(long long a, long long b) { //求最大公约数 long long m = a % b; while(m) { a = b; b = m; m = a % b; } return b; } void PrintFraction(long long a, long long b) { //将一个分数以规定形式输出 long long k = 1; if(b == 0) { printf("Inf"); return; } if(a < 0) { a = -a; k = -1; } long long gcd = GCD(a, b); a /= gcd; //分子分母分别除以最大公约数完成约分 b /= gcd; if(a / b == 0 && a != 0) { //因为正负号储存在k里,k为0的时候无法区别,在这一步处理 if(k > 0) printf("%lld/%lld", a, b); else printf("(-%lld/%lld)", a, b); return; } k = k * a / b; //得到整数部分 a %= b; //得到分子部分 if(b == 1 && k < 0) printf("(%lld)", k); else if(b == 1 && k >= 0) //分子为0,或者分母为1,结果都是整数,直接输出分子部分(不输出分母) printf("%lld", k); else if(k < 0) printf("(%lld %lld/%lld)", k, a, b); else printf("%lld %lld/%lld", k, a, b); } void Print(long long a1, long long b1, long long a2, long long b2, char ch) { //输出一个表达式 long long c1, c2; PrintFraction(a1, b1); //范式输出第一个操作数 printf(" %c ", ch); //输出操作符 PrintFraction(a2, b2); //范式输出第二个操作数 printf(" = "); //输出等号 switch(ch) { //范式输出结果 case '+': c1 = a1 * b2 + a2 * b1; c2 = b1 * b2; PrintFraction(c1, c2); printf("\n"); break; case '-': c1 = a1 * b2 - a2 * b1; c2 = b1 * b2; PrintFraction(c1, c2); printf("\n"); break; case '*': c1 = a1 * a2; c2 = b1 * b2; PrintFraction(c1, c2); printf("\n"); break; case '/': c1 = a1 * b2; c2 = b1 * a2; if(c2 < 0) { //确保PrintFraction函数的b是正数 c2 = -c2; c1 = -c1; } PrintFraction(c1, c2); printf("\n"); break; } } int main() { // freopen("in", "r", stdin); long long a1, b1, a2, b2; scanf("%lld/%lld %lld/%lld", &a1, &b1, &a2, &b2); Print(a1, b1, a2, b2, '+'); Print(a1, b1, a2, b2, '-'); Print(a1, b1, a2, b2, '*'); Print(a1, b1, a2, b2, '/'); return 0; }
总结:
1.复杂繁琐的题目可以先写出主题,再修补特殊情况时的bug;
2.题目虽然说输出部分都是整型,但是计算过程中有乘法,在约分前可能超过整型;只是整型有两组数据出错,题目中把所有整型改成长整型。