编写一个C程序,实现两个分数的加减法。

#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;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值