XTU OJ 1374 连分数

XTU OJ 1374 连分数

题目描述

XTU OJ 1374 连分数_第1张图片比如 n=3,a1=1,a2=2,a3=3,b1=3,b2=2,b3=1时XTU OJ 1374 连分数_第2张图片给定n,ai,i=1,2,…,n,请求x,并按最简方式表示x。

输入

第一个行是一个整数T(1≤T≤100),表示样例的个数。 以后每个样例的第一行为整数n(1≤n≤9); 第二行为n个整数,为ai,(1≤ai≤100); 第三行为n个整数,为bi,(1≤bi≤100)。

输出

按顺序输出一个样例的结果,如果结果为整数,输出整数;如果结果为分数,格式为"分子/分母",保证分子与分母互质。

样例输入

3
3
1 2 3
3 2 1
3
1 2 3
4 7 1
9
100 100 100 100 100 100 100 100 100
99 99 99 99 99 99 99 99 99

样例输出

21/13
1
1060072063970000499/1081277664009800500

思路分析

这道题思路比较简单,找到递推公式即可,但是为防止数据溢出,应用64位整形(__int64或long long),并且每算出一组分子和分母,就要互质操作一次

上代码!

#include 
#include 
__int64 gcd(__int64 m, __int64 n);

int main() {
    int T;
    __int64 a[10], b[10];//数组最好定义在循环外(大数组最好定义在main函数外)
    scanf_s("%d", &T);
    while (T--) {
        int i, n;
        __int64 nume, deno, temp,t;
        memset(a, 0, sizeof(a));
        memset(b, 0, sizeof(b));
        scanf_s("%d", &n);
        for (i = 1; i <= n; i++)scanf_s("%I64d", &a[i]);
        for (i = 1; i <= n; i++)scanf_s("%I64d", &b[i]);
        nume = b[n];//分子:numerator
        deno = a[n];//分母:denominator
        if (n == 1) {
            temp = gcd(nume, deno);
            if (nume % deno == 0)printf("%I64d\n", nume / deno);
            else printf("%I64d/%I64d\n", nume / temp, deno / temp);
        }
        else {
            for (; n > 1; n--) {
                temp = deno;
                deno = a[n - 1] * deno + nume;
                nume = b[n - 1] * temp;
                t = gcd(nume, deno);
                deno /= t;
                nume /= t;
            }
            if (nume % deno == 0)printf("%I64d\n", nume / deno);
            else printf("%I64d/%I64d\n", nume, deno);
        }
    }
    return 0;
}
__int64 gcd(__int64 m, __int64 n) {
    if (m % n == 0)return n;
    else return gcd(n, m % n);
}

你可能感兴趣的:(XTU/Luogu,OJ,算法,c语言)