7-33 有理数加法

题目要求

本题要求编写程序,计算两个有理数的和。

输入格式:
输入在一行中按照a1/b1 a2/b2的格式给出两个分数形式的有理数,其中分子和分母全是整形范围内的正整数。

输出格式:
在一行中按照a/b的格式输出两个有理数的和。注意必须是该有理数的最简分数形式,若分母为1,则只输出分子

算法思路

a1:第一个数的分子; a2:第二个数的分子;
b1:第一个数的分母; b2:第二个数的分母;

第一步: 判断b1,b2是否相等,若不等,求出b1,b2的最小公倍数,相应地a1,a2的值也发生变化;若相等,两个数相加即为(a1+a2)/b1。

第二步:判断分子,分母是否有共同因式,若有共同因式则约去。

第三步:主要是针对输出格式判断。
若分母为1,只输出分子;否则,输出为分式的形式。

#include <stdio.h>

void Calculate(int, int, int, int);

int main() {
    int a1;   //分子
    int b1;   //分母
    int a2;   //分子
    int b2;   //分母
    
    scanf("%d/%d %d/%d", &a1, &b1, &a2, &b2);
    
    Calculate(a1, b1, a2, b2);
    
    return 0;
}

void Calculate(int a1, int b1, int a2, int b2)
{
    int den=1;   //记录b1,b2的最小公倍数
    int i;  
    
    if (b1 != b2)
    {
        while(den%b1 != 0 || den%b2 != 0)    //求出b1,b2的最小公倍数
        {
            den++;
        }
        //通分
        a1 = a1 * (den/b1);
        a2 = a2 * (den/b2);
        b1 = den;
        b2 = den;
        
    }
    
    den = b1; //在b1,b2相等时把b1的值赋给i,确保i保存的是两个分母的最小公倍数
    
    //i保存分子和分母的最小值,为for循环做准备
    if((a1+a2) >= den)
    {
        i = den;
    }
    else
    {
        i= (a1+a2);
    }
     //化简
    int num = a1 + a2;
    for(i; i>1; i--)
    {
        if(den%i == 0 && num%i == 0)
        {
            den = den/i;
            num = num/i;       //(a1+a2) = (a1+a2)/i;  错误写法
        }
    }
    
    if(den == 1)
    {
        printf("%d", num);
    }
    else
    {
        printf("%d/%d", num, den);
    }
}

易错点

注释:num 表示通分后的分子和,b1表式通分后的分母和
在第二步约去共同因式时,我最开始的写法是

int temp1 = b1, temp2 = num;
for(i=1; i<=num && i<=b1; i++)
{
   if(num%i == 0 && b1%i == 0)
        {
            temp1 = b1/i;
            temp2 = num/i;      
        }
    }
}

但这样写其实是错误的!!!
比如 num = b1 = 4,因为是从小到大循环,所以在i=2时,num = 2, b1 =2,随后I的值变为3,之后都不会再化简,即循环结束时 num = b1 = 2,但实际应该是num= b1 =1。

所以我就转换思路,从大到小依次循环

for(i; i>1; i--)
    {
        if(den%i == 0 && num%i == 0)
        {
            den = den/i;
            num = num/i;       //(a1+a2) = (a1+a2)/i;  错误写法
        }
    }

还有一个易错点

(a1+a2) = (a1+a2)/i;  错误写法

即赋值语句的左边不能是一个表达式!!!

英语学习

numerator (分数中的)分子
denominator 分母

小结

如果你有更高效的代码或建议,请不吝赐教!
如果你觉得这篇文章对你有帮助,请为小白博主点个赞,你的点赞是对小白博主最大的鼓励!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值