n个分数求和

题目:

输入第一行给出一个正整数N(≤100)。随后一行按格式a1/b1 a2/b2 …给出N个有理数
输出上述数字和的最简形式 —— 即将结果写成
整数部分 分数部分,
其中分数部分写成分子/分母,要求分子小于分母,且它们没有公因子。
如果结果的整数部分为0,则只输出分数部分。

思路

**(一)**看到这道题目,第一反应想的是直接输入一个分数“a/b”,但是这样的话得到的是一个整数,所以又想把它*0.1转化为double,但是这样相加之后也只能保留部分小数,并不精确
因此此时需采用“将分子分母分开输入,用"/"代替除号

(二) 接下来进行相邻两项的求和,此时需要给一个初始化分子y为0,分母x任意的第一项,才可以与后一项输入的分子a与分母b进行求和,得到新的分子y 与分母x

(三) 求出前后两项b的最小公倍数 并将两个a 相加 加完后就进行约分化简 得到一个最简分数 然后循环,最后控制输出格式。

实践

First.
定义 and 输入

typedef long long ll;
cin >> N;
 char ch;
 int j,k;
 for(i=1;i<=N;i++)
 {
  cin >> a;
  cin >> ch;  //以字符"/"代替除号
  cin >> b;
  c=gongbei(x,b);

Second.
在得到最小公倍数之后,如何算出相应的新分子并进行相加???
此时应用数学来解决!!

d=c/b;
e=c/x;
y=a*d+y*e;  //y就是新的分子之和
x=c;   //将分母x更新为c (此时的最小公倍数

Third.
接着来到化简步骤
先找到分子y与分母x的最大公约数

//化简需要找最大公约数``
 ll gongyue(ll x,ll y)
{
   whiile(x%y != 0)
   {
   	x = y;
   	y = x%y;
   }
   return y;
 }

得到两项的一个和之后,需要及时将结果进行化简
否则会导致分母越来越大

void huajian(ll &x,ll &y) //分母,分子。
//因为化简完的x与y需传给实参,所以要加引用符号
{
 ll a;
 a=gongyue(x,y);
 x=x/a;
 y=y/a;
}

Last.
控制输出格式

 if((y>x)||((y<x)&&(fabs(y)>x)))   
 { 
 	j = y/x;
   	k = y-j*x;
   	if(k!=0)
    		cout << j << " " << k << "/" << x;
   	else cout<<j;
 }
 else cout << y << "/" << x;
  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值