给定n个分数,计算它们的乘积,结果要求为即约分数或整数
输入描述:
输入有n+1行,第一行有一个正整数n,表示分数的个数。
第2-n+1行,每行有2个整数,分别表示该分数的分子和分母,其中分母不为0;
合法的输出形式:1,-1,-2/3。不合法的输出形式1/-2,2/4。
提示:最终结果肯定不会溢出,但是中间结果可能溢出。
#include <stdio.h>
/* 求a与b的最大公因数,并除去该公因数, */
void Maxyinshu(unsigned int *a, unsigned int *b)
{
int aa = *a, bb = *b;
int m = aa * bb;
int c = aa % bb;
while(c){
aa = bb;
bb = c;
c = aa % bb;
}
*a = *a / bb;
*b = *b / bb;
}
int main () {
unsigned int n;
scanf("%d", &n);
unsigned int a[n], b[n];
int flag = 1; //符号位
for(int i = 0; i < n; ++i){
scanf("%d", &a[i]);
scanf("%d", &b[i]);
/* 1、将符号位算出 */
if(a[i] < 0){
flag = -flag;
a[i] = -a[i];
}
if(b[i] < 0){
flag = -flag;
b[i] = -b[i];
}
}
/* 2、将分子与每个分母进行比较,去除最大公因数 */
for(int i = 0; i < n; ++i){
if(a[i] == 1)continue;
for(int j = 0; j < n; ++j){
if(b[i] == 1)continue;
Maxyinshu(&a[i], &b[i]);
}
}
int q = 1, w = 1;
for(int i = 0; i < n; ++i){
q *= a[i];
w *= b[i];
}
if(flag == -1)
printf("-");
if(q % w == 0)
printf("%d", q / w);
else
printf("%d/%d ", q, w);
return 0;
}