7-35 有理数均值

本题要求编写程序,计算N个有理数的平均值。

输入格式

输入第一行给出正整数N(≤100);第二行中按照a1/b1 a2/b2 …的格式给出N个分数形式的有理数,其中分子和分母全是整形范围内的整数;如果是负数,则负号一定出现在最前面。

输出格式

在一行中按照a/b的格式输出N个有理数的平均值。注意必须是该有理数的最简分数形式,若分母为1,则只输出分子。

输入样例1

4
1/2 1/6 3/6 -5/10

输出样例1

1/6

输入样例2

2
4/3 2/3

输出样例2

1

分析与答案

和前面的有理数加法是类似的,只是这里有多个有理数,而且有正有负。用两个数组分别表示分子和分母,再用两个变量分别表示结果的分子和分母,每次加法操作之前先判定两个加数的分母是否相同,相同则分子相加,不相同则先化简两个分数,再使用公式相加。对结果的分母乘以输入的有理数个数(相当于整体求平均)再进行化简,如果化简结果里分母为1,则只输出分子,否则以分数形式输出。

#include <stdio.h>

void sim(int* up,int* down);
int main(){
    int num;
    scanf("%d",&num);
    int up[100]={0},down[100]={0};
    for(int i=0;i<num;i++){
        scanf("%d/%d",&up[i],&down[i]);
        getchar();
    }
    int a1=up[0],b1=down[0],a2=up[1],b2=down[1];
    int *res_up = &a1,*res_down = &b1;
    for(int i=1;i<num;i++){
        if(b1!=b2){
            sim(&a1,&b1);
            sim(&a2,&b2);
            a1=a1*b2+a2*b1;
            b1=b1*b2;
        }
        else
            a1 = a1+a2;
        //sim(res_up,res_down);
        a2=up[i+1];
        b2=down[i+1];
    }
    *res_down *= num;
    sim(res_up,res_down);
    if(*res_down == 1)
        printf("%d",*res_up);
    else
        printf("%d/%d",*res_up,*res_down);
    return 0;
}
void sim(int *up,int *down){
    int upIsNegative = 0,downIsNegative = 0;
    if(*up<0){
        upIsNegative = 1;
        *up = - *up;
    }
    if(*down<0){
        downIsNegative = 1;
        *down = - *down;
    }
    if(*up%*down == 0){
        //printf("%d",up/down);
        *up /= *down;
        *down = 1;
    }
    else{
        int i = *down>*up?*up:*down;
        while(i!=1 && *up!=1){
            if(*up%i == 0 && *down%i == 0){
                *up /= i;
                *down /=i;
            }
            i--;
        }
        //printf("%d/%d",up,down);
    }
    if((upIsNegative && !downIsNegative)||(!upIsNegative && downIsNegative)){
        *up = -*up;
    }
}

7-35 测试点