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;
}
体会:这种输出分数的题目,只能分子分母分别保存,找出相应公式计算