zoukankan      html  css  js  c++  java
  • 【JavaScript】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

    JavaScript代码:

    const { parse } = require('path')
    let readline = require('readline')
    
    const rl = readline.createInterface({
        input: process.stdin,
        output: process.stdout
    })
    
    let lineCounts=2   //输入的行数
    let tempArray=[]    //创建数组来存储每一行的数据
    let tempArrayIndex=0//初始化数组的索引
    
    rl.on('line', function(line) {
    
        //将每一行的内容添加至数组tempArray
        tempArray[tempArrayIndex]=line
        tempArrayIndex++
    
        if (tempArray.length == lineCounts) {
            let N = parseInt( tempArray[0] )
            let tokens = tempArray[1]
            let strArr = tokens.split(' ')
    
            let fracArr = []
            for (let i = 0; i < strArr.length; i++) {
                let tArr = strArr[i].split('/')
                let tnum = parseInt(tArr[0])
                let tdeno = parseInt(tArr[1])
    
                fracArr.push( {num : tnum, deno : tdeno} ) 
            
            }
            let ret = main(fracArr)
            console.log(ret)
            rl.close();
        }
        
    })
    
    function main(fracArr) {
        let ret = reduce(average(fracArr))
        
        if (ret.deno == 1) {
            return ret.num
        } else {
            return ret.num + '/' + ret.deno
        }
    }
    
    function average(fracArr) {
        let sumret = {
            num : 0,
            deno : 1
        }
        for (let i = 0; i < fracArr.length; i++) {
            sumret = sum(sumret, fracArr[i])
        }
        
        sumret.deno = sumret.deno * fracArr.length
        return sumret
    }
    
    function sum(frac1, frac2) {
        let a1 = frac1.num
        let a2 = frac2.num
        let b1 = frac1.deno
        let b2 = frac2.deno
        
        let frac = {}
    
        if (b1 == b2) {
            b = b1
            a = a1 + a2
        } else { 
            b = b1 * b2 / gcd(b1, b2)     //最小公倍数=两个数相乘再除以最大公约数
            a = a1 * b / b1 + a2 * b / b2
        }
       
        
        frac.num = a
        frac.deno = b
    
        return reduce(frac)
    }
    
    
    //求最大公约数
    function gcd(n, m ){ 
        if(m == 0) return n
    
        return gcd( m, n % m ) 
    }
    
    //化简
    function reduce(frac) {
        let m = frac.num
        let n = frac.deno
        
        let g = gcd(m, n)
        m = m / g
        n = n / g
    
        return {
            num : m,
            deno : n
        }
    }
  • 相关阅读:
    HDU1213How Many Tables并查集
    Redis新的存储模式diskstore
    GPFS文件系统笔记
    redis持久化
    360安全卫士qurl.f.360.cn分析
    [原创]解决DataSet的GetXml()方法空列不返回问题
    在多台服务器上简单实现Redis的数据主从复制
    史航416随笔
    史航416实验1总结
    史航416第二次作业总结
  • 原文地址:https://www.cnblogs.com/moonskies/p/14439646.html
Copyright © 2011-2022 走看看