7-35 有理数均值(20 分)

7-35 有理数均值(20 分)
本题要求编写程序,计算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

import java.util.Scanner;
public class RationalMean {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int sumMen;
        int sumDeo;
        System.out.println("请输入一个不超过100的正整数N:");
        int N = sc.nextInt();
        System.out.println("输入一行N个带分式的有理数求均值:");
        String[] a = new String[N];
        for (int i = 0; i < N; i++) {
            a[i] = sc.next();
        }
        String[][] b = new String[N][2];
        for (int i = 0; i < N; i++) {//分割N个字符串,存入b[i][0]b[i][1]中
            String[] c = a[i].split("/");//标点 -也被算进去了导致分割出错,只用/就分割就行,不用正则
            b[i][0] = c[0];
            b[i][1] = c[1];
        }
        int[][] d=new int[N][2];
        for(int i = 0;i < 2;i++){
            for(int j = 0;j < 2;j++){
                d[i][j] = Integer.parseInt(b[i][j]);
            }
        }
        sumMen = d[0][0] * d[1][1] + d[0][1] * d[1][0];
        sumDeo = d[0][1] * d[1][1];
        if (N == 2) {
            sumMen/=N;
            int c=f(sumMen,sumDeo);
            sumMen/=c;
            sumDeo/=c;
            if(sumMen==1)//分母为1
                System.out.println(sumMen);
            else
                System.out.println(sumMen+"/"+sumDeo);
        }
         else if(N > 2){
            for (int i = 2; i < N; i++) {
                for(int j = 0;j < 2;j++) {
                    d[i][j] = Integer.parseInt(b[i][j]);
                }
                sumMen = sumMen * d[i][1]+ d[i][0]* sumDeo;
                sumDeo=sumDeo*d[i][1];
            }
            sumMen/=N;//求均值
            int c=f(sumMen,sumDeo);
            sumMen/=c;
            sumDeo/=c;
            if(sumDeo == 1)
                System.out.println(sumMen);
            else
                System.out.println(sumMen+"/"+sumDeo);
        }
    }
    public static int  f(int a,int b){//该方法返回最大公约数
        if(a < b){
            int c=a;
            a=b;
            b=c;
        }
        int r=a%b;
        while(r != 0){
            a=b;
            b=r;
            r=a%b;
        }
        return  b;
    }
}

代码尽可能整洁了,这个题注意一下spilt的正则表达式就行,其实用不着,直接点还不会出错。我的做法希望能对有疑惑的小伙伴提供帮助!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值