您的位置:首页 > 其它

HDU 5912 Fraction 模拟题 【2016中国大学生程序设计竞赛(长春)】

2017-09-12 22:33 423 查看

Fraction

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)

Total Submission(s): 1280 Accepted Submission(s): 661

Problem Description

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≤8).

The second line contains n integers: a1,a2,⋯an(1≤ai≤10).

The third line contains n integers: 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

Source

  2016中国大学生程序设计竞赛(长春)-重现赛

  

解题分析:

  这道题是一道模拟题,主要是要以分数的形式保存每次的计算结果(要是真分数),最后的分子和分母就输出。

AC代码:

#include<stdio.h>

int gcd(int a, int b)
{
if(!(a%b))
return b;
return gcd(b, a%b);
}

int main()
{
int a[10], b[10];
int i, x, y, k, T, n, t = 1, p;
scanf("%d", &T);
while(T--){
scanf("%d", &n);
a[0] = b[0] = 0;
for(i = 1; i <= n; i++) scanf("%d", &a[i]);
for(i = 1; i <= n; i++) scanf("%d", &b[i]);
if(n == 1){
k = gcd(b[1], a[1]);
printf("Case #%d: %d %d\n", t++, b[1]/k, a[1]/k);
continue;
}
x = a
*a[n-1]+b
;
y = a
;
k = gcd(x, y);
x /= k;
y /= k;
for(i = n-1; i > 1; i--){
p = y*b[i]+a[i-1]*x;
y = x;
x = p;
k = gcd(x, y);
x /= k;
y /= k;
}
p = y*b[1];
y = x;
x = p;
k = gcd(x, y);
y /= k;
x /= k;
printf("Case #%d: %d %d\n", t++, x, y);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  模拟
相关文章推荐