Fraction(长春重现赛)

16 篇文章 0 订阅
11 篇文章 0 订阅

Question:题目详情(http://acm.hdu.edu.cn/contests/contest_showproblem.php?pid=1002&cid=728)
题目大意:给你一个公式法f(x)=b[n]/(a[n]+f(x+1)),边界值为f(n)=b[n]/a[n],求f(1),并且输出分数(分子和分母分别输出)
题解思路:第一想到的就是递归,可以用两个全局变量p,q 来分别表示分子和分母,注意在过程中要不用gcd通分,每次的f(x+1)用p,q来表示,根据公式可以推出p=q*b[x],q=q*a[x]+p;这样不断循环计算,即可的得到最终答案

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
using namespace std;
const int INF=0x3f3f3f3f;
int p,q,n,T,a[15],b[15],ncase;
int gcd(int x,int y)  //gcd求最大公约数
{
    if(y==0)
        return x;
    return gcd(y,x%y);  
}
void fac(int x)
{
    while(x>=1)  //用循环推出f(1);
    {
        int tp=p,tq=q;  //先保存p,q
        p=tq*b[x];    //推导出的公式
        q=tq*a[x]+tp;
        int t=gcd(p,q);  //注意,先保存gcd,因为在下述过程中,p,q会改变
        p/=t;
        q/=t;
        x--;
    }
}
int main()
{
    cin>>T;
    while(T--)
    {
        cin>>n;
        for(int i=1;i<=n;i++)
            cin>>a[i];
        for(int i=1;i<=n;i++)
            cin>>b[i];
        int g=gcd(a[n],b[n]);//先求f(n)=b[n]/a[n];
        p=b[n]/g;
        q=a[n]/g;
        fac(n-1); //算了f(n)了,只需把n-1导入函数
        cout<<"Case #"<<++ncase<<": "<<p<<" "<<q<<endl;
    }
    return 0;
}

体会:这种输出分数的题目,只能分子分母分别保存,找出相应公式计算

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值