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

来源:互联网 发布:win10安装软件失败 编辑:程序博客网 时间:2024/05/28 16:15

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的正则表达式就行,其实用不着,直接点还不会出错。我的做法希望能对有疑惑的小伙伴提供帮助!

原创粉丝点击