比如 n=3,a1=1,a2=2,a3=3,b1=3,b2=2,b3=1时
给定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);
}