一本通————1209 分数求和

1001-高同学

发表文章数:265

热门标签

首页 » LeetCode » 正文

1209:分数求和

时间限制: 1000 ms         内存限制: 65536 KB
提交数: 4671     通过数: 2617

【题目描述】

输入nn 个分数并对他们求和,并用最简形式表示。所谓最简形式是指:分子分母的最大公约数为11 ;若最终结果的分母为11 ,则直接用整数表示。

如:56、10356、103 均是最简形式,而3636 需要化简为12,3112,31 需要化简为33 。

分子和分母均不为00 ,也不为负数。

【输入】

第一行是一个整数nn ,表示分数个数,1≤n≤101≤n≤10 ;

接下来nn 行,每行一个分数,用”p/qp/q “的形式表示,不含空格,p,qp,q 均不超过1010 。

【输出】

输出只有一行,即最终结果的最简形式。若为分数,用”p/qp/q “的形式表示。

【输入样例】

2
1/2
1/3

【输出样例】

5/6

【来源】

No

 

 

这道题划分到了递归里面,主要是考分数在约分的时候递归求解最大公约数

#include <bits/stdc++.h>
using namespace std;

int gcd(int m,int n)
{
    return n==0?m:gcd(n,m%n);
}


void calculate(int &f,int &m,int x,int y)
{
    if(f==0&&m==0)    //如果是第一个分式
    {
        f=x;
        m=y;
        return;
    }
    f=f*y;    
    x=x*m;    //先计算通分后的分子
    m=m*y;    //在计算分母
    y=m;
    f=f+x;    //两个分式相加
    int c=gcd(f,m); 
   
    f=f/c;
    m=m/c;
 
    return;
}

int main()
{
    int n;string str;
    int len,j,x,y,f=0,m=0;    //由于第一个分母不好记录,这里设置了“flag”
    cin>>n;
    for(int i=1; i<=n; i++)
    {
        x=y=j=0;
        cin>>str;
        len=str.length();

        while(str[j]!='/')    //对读入的式子进行划分
        {
            x=x*10+str[j]-'0';
            j++;
        }
        j++;    //不要忘记j+1,因为此时str[j]=='/'
        while(j<len)
        {
            y=y*10+str[j]-'0';
            j++;
        }
     
        calculate(f,m,x,y);
       
    }
    if(m==1)
    {
        cout<<f<<endl;
    }else
    {
        cout<<f<<"/"<<m<<endl;
    }

    return 0;
}

 

标签:

拜师教育学员文章:作者:1001-高同学, 转载或复制请以 超链接形式 并注明出处 拜师资源博客
原文地址:《一本通————1209 分数求和》 发布于2020-02-10

分享到:
赞(0) 打赏

评论 抢沙发

评论前必须登录!

  注册



长按图片转发给朋友

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏

Vieu3.3主题
专业打造轻量级个人企业风格博客主题!专注于前端开发,全站响应式布局自适应模板。

登录

忘记密码 ?

您也可以使用第三方帐号快捷登录

Q Q 登 录
微 博 登 录