1. 程式人生 > >5912 】【Fraction】

5912 】【Fraction】

題目:

Mr. Frog recently studied how to add two fractions up, and he came up with an evil idea to trouble you by asking you to calculate the result of the formula below:   As a talent, can you figure out the answer correctly?

Input

The first line contains only one integer T, which indicates the number of test cases.  For each test case, the first line contains only one integer n (n≤8n≤8).  The second line contains n integers: a1,a2,⋯an(1≤ai≤10a1,a2,⋯an(1≤ai≤10).  The third line contains n integers: b1,b2,⋯,bn(1≤bi≤10)b1,b2,⋯,bn(1≤bi≤10).

Output

For each case, print a line “Case #x: p q”, where x is the case number (starting from 1) and p/q indicates the answer.  You should promise that p/q is irreducible.

Sample Input

1
2
1 1
2 3

Sample Output

Case #1: 1 2


        
 

Hint

Here are the details for the first sample:
2/(1+3/1) = 1/2

        
題意:求解圖中的表達是的最終結果,最後輸出分子分母。

解題思路:不得不說,看了有一會才理解了圖中的居然是個表示式,= = 為自己汗顏,看到這個表示式,不用想,必須會用到遞推,因為上層表示式的分母必須要由下層的結果來計算,所以需要倒著推。

ac程式碼:

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

int n;
int a[105];
int b[105];
int gcd(int a,int b)
{
	if(b==0)
		return a;
	return gcd(b,a%b);
}
int frac(int num)
{
	if(num==n-1)
		return 1.0*b[n-1]/a[n-1];
	else
		return 1.0*b[num]/(a[num]+frac(num+1));
}
int main()
{
	int t;
	cin>>t;
	int Case=0;
	while(t--)
	{
		scanf("%d",&n);
		for(int i=1;i<=n;i++)
			scanf("%d",&a[i]);
		for(int i=1;i<=n;i++)
			scanf("%d",&b[i]);
	//	cout<<frac(0)<<endl;		
		int tmp;
		int f=a[n],ff=1;
		for(int i=n-1;i>=1;i--)
		{
			tmp=a[i]*f+b[i+1]*ff;
			ff=f;
			f=tmp; 
		}
		ff=ff*b[1];//ff是隻計算分子的值,for結束後f是分母的值。
		int k=gcd(ff,f);
		printf("Case #%d: %d %d\n",++Case,ff/k,f/k);
	}
	return 0;
}