一、实现目标
输入两个分数,中间是四则运算符(+,-,*,/),程序输出分数形式的运算结果。
样例输入:1,2,+,1,3
样例输出:5/6 (1/2+1/3)
二、实现步骤
1、求最大公约数
定义一个函数,求两个输入参数的最大公约数。函数如下:
int gys(int x, int y)
{
return y ? gys (y, x % y) : x; # 递归,y不为0则计算gys(y, x%y)
}
在主函数中调用并测试这个函数:
求32和128的最大公约数:
printf("%d", gys(32, 128));
输出:
2、求最小公倍数
定义一个函数,求两个输入参数的最小公倍数。函数如下:
int gbs(int x, int y)
{
return x * y / gys(x, y); # 使用定理:两数的乘积等于它们的最小公倍数乘以最大公约数
}
在主函数中调用并测试这个函数:
求32和128的最小公倍数:
printf("%d", gbs(32, 128));
输出:
3、两数约分
定义一个函数,将两个输入参数进行约分。函数如下:
void yuefen(int fz, int fm)
{
int s = gys(fz, fm);
fz /= s;
fm /= s;
printf("the result is %d/%d\n", fz, fm);
}
在主函数中调用并测试这个函数:
将32/128进行约分:
yuefen(32, 128);
输出:
4、实现分数的四则运算
加法运算实现:
void add(int a, int b, int c, int d)
{
int u1, u2, v=gbs(b, d), fz1, fm1;
u1 = v / b * a;
u2 = v / d * c;
fz1 = u1 + u2;
fm1 = v;
yuefen(fz1, fm1);
}
在主函数中调用并测试加法函数:
add(1, 3, 2, 4); // 计算1/3 + 2/4的值
输出:
减法运算实现:
void sub(int a, int b, int c, int d)
{
int u1, u2, v=gbs(b, d), fz1, fm1;
u1 = v / b * a;
u2 = v / d * c;
fz1 = u1 - u2;
fm1 = v;
yuefen(fz1, fm1);
}
在主函数中调用并测试减法函数:
sub(1, 2, 1, 6); // 计算1/2 - 1/6的值
输出:
乘法运算实现:
void mul(int a, int b, int c, int d)
{
int u1, u2;
u1 = a * c;
u2 = b * d;
yuefen(u1, u2);
}
在主函数中调用并测试乘法函数:
mul(5, 6, 2, 3); // 计算5/6 * 2/3的值
输出:
除法运算实现:(原理和乘法相同)
void div(int a, int b, int c, int d)
{
int u1, u2;
u1 = a * d;
u2 = b * c;
yuefen(u1, u2);
}
在主函数中调用并测试除法函数:
div(5, 6, 2, 3); // 计算5/6 ÷ 2/3的值
输出:
5、主函数
按照要求的格式输入,使用switch-case语句判断运算类型:
int main()
{
// printf("%d", gys(32, 128));
// printf("%d", gbs(32, 128));
// add(1, 3, 2, 4);
// sub(1, 2, 1, 6);
// mul(5, 6, 2, 3);
// div(5, 6, 2, 3);
char op;
int a, b, c, d;
scanf("%ld,%ld,%c,%ld,%ld", &a, &b, &op, &c, &d);
switch(op)
{
case '+': add(a, b, c, d);
case '-': sub(a, b, c, d);
case '*': mul(a, b, c, d);
case '/': div(a, b, c, d);
}
return 0;
}
三、程序测试
加法测试:
减法测试:
乘法测试:
除法测试: