pat 乙级 1034 四则运算表示
pat乙级1034
输入:
2/3 -4/2
输出:
2/3 + (-2) = (-1 1/3)
2/3 - (-2) = 2 2/3
2/3 * (-2) = (-1 1/3)
2/3 / (-2) = (-1/3)
需要两个函数,第一个func是对两个数字(分子和分母进行化简)第二个函数gcd是对两个数字求最大公因数
gcd函数
long long gcd(long long t1, long long t2) {
return t2 == 0 ? t1 : gcd(t2, t1 % t2);
}
第一次比如 10 6,将10中的6抹去变成6 4 再寻找他们的最大公因数,如果找到这个数字x就可以把之前抹去的6分解为若干个x同样达到最大公因数效果,如果没找到则再进行
一次将6中4抹去,变成 4 2(注意每一次要将t2变成t1因为要把大的放在前面,如果一开始是6 10,进行一次gcd函数会变成 10 6)最终找到非1的最大公因数x==2,返回。
func函数
void func(long long m, long long n) {
if (m * n == 0) {//判断有零的情况下处理
printf("%s", n == 0 ? "Inf" : "0");
return ;
}
bool flag = ((m < 0 && n > 0) || (m > 0 && n < 0));//如果分子分母异号就添加负号
m = abs(m); n = abs(n);
long long x = m / n;
printf("%s", flag ? "(-" : "");//是否添加符号
if (x != 0) printf("%lld", x);//假分数
if (m % n == 0) {
if(flag) printf(")");
return ;
}
if (x != 0) printf(" ");//假分数输出一个空格
m = m - x * n;
long long t = gcd(m, n);//约分
m = m / t; n = n / t;
printf("%lld/%lld%s", m, n, flag ? ")" : "");
}
main函数
int main() {
scanf("%lld/%lld %lld/%lld", &a, &b, &c, &d);//读取四个数字下面四个依次进行加减乘除,每一次都相当于进行一次对分子分母化简
func(a, b); printf(" + "); func(c, d); printf(" = "); func(a * d + b * c, b * d); printf("\n");
func(a, b); printf(" - "); func(c, d); printf(" = "); func(a * d - b * c, b * d); printf("\n");
func(a, b); printf(" * "); func(c, d); printf(" = "); func(a * c, b * d); printf("\n");
func(a, b); printf(" / "); func(c, d); printf(" = "); func(a * d, b * c);
return 0;
}
版权声明:本文为CSDN博主「柳婼」的原创文章,遵循CC 4.0 BY-SA版权协议。
原文链接:https://blog.csdn.net/liuchuo/article/details/51994755