题目描述
x=b1/a1+b2/a2+b3/a3+⋯
比如 n=3,a1=1,a2=2,a3=3,b1=3,b2=2,b3=1时
x=31+22+13=2113
给定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
思路:从循环的最后一层计算列出划为分数的表达式,分别算出分子分母判断是否有余数输出整数或通过最大公因数的函数得到互质的分子分母输出;
注意:用int类型输出不对(可能数会超过范围)
#include<stdio.h>
#include<string.h>
long long gcd(long long a,long long b)//找公因数
{
long long c = a%b;
while(c)//7 4
{
a = b;
b = c;
c = a%b;
}
return b;
}
int main()
{
int t;
int a[100],b[100];
scanf("%d",&t);
while(t--)
{
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
int n;
scanf("%d",&n);
for(int i = 0;i<n;i++)
scanf("%d",&a[i]);
for(int i = 0;i<n;i++)
scanf("%d",&b[i]);
long long fenzi = b[n-1];//从最后一层开始
long long fenmu = a[n-1];
for(int i = n-2;i>=0;i--)
{
long long temp = fenmu;
fenmu = a[i]*temp+fenzi;
fenzi = b[i]*temp;
//printf("%I64d %I64d\n",fenzi,fenmu);
}
if(fenzi%fenmu==0)//可以整除
printf("%I64d\n",fenzi/fenmu);
else
{
long long g = gcd(fenzi,fenmu);
printf("%I64d/%I64d\n",fenzi/g,fenmu/g);
}
}
}