算法:用最小分数表示有限小数和无限循环小数——JavaScript实现

输入用例:0.25或2.00或0.25(285714)
输入用例要求:整数不省略小数部分,如2.00,无限循环小数中()表示循环体
输出用例:1/4或2或177/700
难点在于如何表示循环体

思路:在这里插入图片描述

// 用最小分数表示小数
function func(str){
    var reg2=/^\d+\.\d+(\(\d+\)){0,1}$/
    var reg1=/^\d+\.\d+$/
    if(reg2.test(str)){
        if(reg1.test(str)){
            //有限小数
            var mid=str.split('.')
            var zh=mid[0]
            var xs=mid[1]
            var len=xs.length
            var fenmu=Math.pow(10,len)
            var fenzi=parseFloat(str)*fenmu
            var zhi=findMax(fenzi,fenmu)
            var fenmu=fenmu/zhi
            var fenzi=fenzi/zhi
            console.log('有限小数')
            if(fenmu==1){
                console.log(fenzi)
            }
            else{
                console.log(fenzi+'/'+fenmu)
            }
            
        }
        else{
            //无限循环小数
            var mid=str.split('.')
            var zh=mid[0]
            var ne=mid[1].split(/[\(\)]/)
            var xs=ne[0]
            var xh=ne[1]
            var left=parseFloat(zh+'.'+xs)
            var lenxs=xs.length
            var leftfenmu=Math.pow(10,lenxs)
            var leftfenzi=left*leftfenmu
            var lenxh=xh.length
            var ch=parseInt(new Array(lenxh).fill(9).join(''))
            var rightfenmu=parseInt((new Array(lenxh).fill(9)).concat(new Array(lenxs).fill(0)).join(''))
            var rightfenzi=parseInt(xh)
            var fenzi=ch*leftfenzi+rightfenzi
            var fenmu=rightfenmu
            var zhi=findMax(fenzi,fenmu)
            var fenzi=fenzi/zhi
            var fenmu=fenmu/zhi
            console.log(fenzi+'/'+fenmu)
        }
    }
    else{
        console.log('Invalid Number')
    }
}
function findMax(a,b){
    var minzhi=Math.min(a,b)
    var res=1
    for(var i=minzhi;i>0;i--){
        if(a%i==0&&b%i==0){
            res=i
            break
        }
    }
    return res
}
func('0.25(285714)') //调用函数
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值