7-35 有理数均值

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. 如何存储分子分母;
  2. 如何得到分子分母的总和;
  3. 如何得到最大公约数;
  4. 如何解决最大N;

解决:

  1. 定义结构体数组,存储每个数的分子和分母
  2. 分母总和=每个数的分母相互乘积;分子总和=其余数的分母乘积*分子的累加和;
  3. 利用辗转相除法求最大公约数;
  4. ​加上分母总和等于0的判断即可排除分母为零的时的情况

实现代码:

#include<stdio.h>
struct shu{     //定义一个结构体用来存放分子分母
  int fz;
  int fm;
};
int main(){
    int N;
    int sumfz = 0; //分子的和
    int sumfm = 1;//分母的和
    int sum = 1;  //每个分子需要乘的其他数的分母的乘积
    int yue;    //最大公约数
    struct shu a[102];
    scanf("%d",&N);
    if(N == 0||N>100)//N 不在范围时,从新输入
        scanf("%d",&N);
    
    for(int i = 0;i < N;i++){   //输入分母、分子
        scanf("%d/%d",&a[i].fz,&a[i].fm);
    }

    for(int j = 0;j< N;j++){
            sumfm *= a[j].fm; //将每个分母相乘的到分母总和
            for(int k = 0;k < N;k++){
                if(j != k){
                    sum *=a[k].fm;//找到其他数分母的乘积
                }
            }
            sumfz +=a[j].fz*sum; //分子的总和
            sum = 1;
    }
    
    if(sumfz == 0){ //若分子总和为0时,输出0,解决除0的情况
        printf("0");
        return 0;
    }
    
    sumfm =sumfm*N;//求平均值,直接将N乘到分母总和上直接一起求最大公约数
    yue = yue1(sumfz,sumfm);    //求最大公约数
    if(sumfz % sumfm == 0){  
        printf("%d",sumfz/sumfm);
    }
    else{
        printf("%d/%d",sumfz/yue,sumfm/yue);
    }
}
int yue1(int a,int b){ //辗转相除法求最大公约数
   if(b == 0)
       return 1;
    int r = a %b;
    while(r != 0){
        a = b;
        b = r;
        r = a%b;
    }
    return b;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值