题目要求
本题要求编写程序,计算两个有理数的和。
输入格式:
输入在一行中按照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 分母
小结
如果你有更高效的代码或建议,请不吝赐教!
如果你觉得这篇文章对你有帮助,请为小白博主点个赞,你的点赞是对小白博主最大的鼓励!