#include<stdio.h>
int main() {
int a, b, c, d,t,r,n,x,i,y,z1,z2,fenzi1,fenzi2,fenzi,fenzi0; //abcd分别是初始分子1分母1分子2分母2、t是存储临时变量用作交换的,fenzi0是判断最后输出符号的,
char o; //xy存储两个分母,fenzi1和fenzi2是两个最终分子,z1和z2是存最开始的两个分子 r求余,n是分母的积
int fenmu;
printf("请输入分子1/分母1符号分子2/分母2,分母不能为0:\n"); // 6/12+3/12 只计算了两个正数的加减法,
scanf("%d/%d%c%d/%d", &a, &b, &o, &c, &d);
printf("%d/%d%c%d/%d\n", a, b, o, c, d); //看输出是否有误
x = b;
y = d;
z1 = a; z2 = b;
if (b < d) { //把分母较大的分数放前面,为求最小共倍数做准备,先做分母的通分,
t = b;
b = d;
d = t;
/*t = a;
a = c;
c = t;*/
}
r = b % d;
n = b * d;
while (r != 0) { //求最小公倍数, 用较大的分母对较小的分母求余,=r 再把两个分母相乘
b = d; // 把较小的字母复制给较大的,把求出来的余数赋值给较小的,再用较大的数对较小的数进行求余运算,
d = r; //如果最终结果结果为0,就跳出循环,最初分母相乘的值/经过运算的最小数的值,等于最小共倍数,
r = b % d;
}
fenmu = n / d; //分母通分完成,
fenzi1 = a * (fenmu / x); //分子1通分完成 分子1=通分后分母/原分母。用值再成分子, 做到及时分母位置改变,但是两个数的原本值不变,
printf("通分后分子1=%d\n", fenzi1); //方便判断求出的分子1是否有误
fenzi2 = c * (fenmu/ y); //分子2通分完成
printf("通分后分子2=%d\n", fenzi2); //方便判断求出的分子2是否有误
printf("通分后分母=%d\n", fenmu); //判断通分后的分母是否有误;
//if (fenzi1 < fenzi2)
//{
// t = fenzi1;
// fenzi1 = fenzi2; //如果通分后分子1的值大于分子2,做一下交换,但是没用,故注释,
// fenzi2 = t;
//}
if (o == '+') {
fenzi = fenzi1 + fenzi2; //判断是+运算直接进行计算,
}
else if (o == '-') { //如果判断是-运算需判断
if (fenmu /fenzi2== x /z1){ //通分后的分式1的分母除分子,和通分前分式2的分母/分子值相等,证明做过互换,需要换回来,
t = fenzi1;
fenzi1 = fenzi2;
fenzi2 = t;
}
fenzi = fenzi1 - fenzi2; //进行减法运算,
}
printf("计算得:%d/%d\n", fenzi, fenmu);
fenzi0 = fenzi; //把分子的值给一个临时变量fenzi0,
if (fenzi < 0) //判断如果分子为负数,先变成整数, ,如果不换符号,负数和正数无法进行约分
fenzi = -fenzi;
if (fenzi == 0) //如果分子为0,直接输出0,
printf("最终结果为:0");
else { //如果不是,进行约分
for (i = 2; i <= fenzi; i++) { //约束大于2,找分子大于2的余数,如果有。分子分母同时除这个数,进行约分,i值重新变成2判断,
if (fenzi % i == 0) { //直到不能约分为止。
if (fenmu % i == 0) {
fenzi = fenzi / i;
fenmu = fenmu / i;
i = 2;
}
}
}
if (fenzi0 < 0) //如果临时变量<0,证明分子符号改变过,再变回来即可,
fenzi = -fenzi;
printf("约分为:%d/%d", fenzi, fenmu);
}
return 0;
}
编写一个C程序,实现两个分数的加减法。
最新推荐文章于 2024-04-22 07:50:51 发布