zoukankan      html  css  js  c++  java
  • 两个数字相除

    由于精度问题,不能说两个超大数字相除...

    计算机的二进制实现和位数限制有些数无法有限表示。就像一些无理数不能有限表示,如 圆周率 3.1415926...,1.3333... 等。

    IEEE 754 规范

    这里的代码,被除数如果超过16位,除数大于6位,就出现很明显的问题了。(即使达到上面两个条件,这里的浮点运算也不能做到很精准,仅供参考)。

    function except(f, t) {
        f += '';
        let i, j, curr, mult, n, inte, decimalLen, zl, z,
            len = f.length,
            currIndex = 0,
            arr = [],
            zero = 0,
            fArr = f.split('').reverse().join(''),
            current,
            result = [],
            decimal = '',
            decimalArr = [],
            reg = new RegExp(/^(0+)/gi);
    
        function addZero(n) {
            z = '';
            for (j = 0; j < n; j++) {
                z += '0';
            }
            return z;
        }
        for (i = 0; i < len; i++) {
            arr[i] = [fArr[i], addZero(i)]
        }
        for (i = 0; i < len; i++) {
            current = arr[i];
            n = current[0]
            curr = n / t + '';
            currIndex = curr.indexOf('.');
            zero = current[1];
            if (currIndex > -1) {
                zl = zero.length;
                inte = curr.slice(0, currIndex);
                decimal = curr.slice(currIndex + 1);
                decimalLen = decimal.length;
                if (zl >= decimalLen) {
                    inte = inte === '0' ? '' : inte;
                    result[i] = inte + decimal + zero.slice(decimalLen);
                } else {
                    curr = inte + decimal.slice(0, zl);
                    if (n * 1 < t) {
                        curr = curr.replace(reg, '');
                    }
                    result[i] = curr;
                    decimalArr.push((decimal + '0').slice(zl, zl + 2));
                }
    
            } else {
                result[i] = curr + zero;
            }
        }
    
        len = decimalArr.length;
        current = 0;
        for (i = 0; i < len; i++) {
            current += decimalArr[i] * 1;
        }
        len = result.push(Math.round(current / 100) + '');
        mult = result[0];
        for (i = 1; i < len; i++) {
            mult = largeCount(mult || '0', result[i] || '0');
        }
        return mult;
    }
    

    largeCount 方法在我博文里面有,这里就不贴了。

    声明:严禁抄袭,欢迎转载!不过请带上博文链接!

    或者你有更好的实现方式、或者你觉得有可以优化的地方,不妨评论讨论下!觉得得到帮助的可以点个推荐,让更多人也可以得到帮助。

  • 相关阅读:
    Placing Rooks-CF 1342E
    Yet Another Counting Problem-CF 1342C
    [SDOI2016]齿轮
    Rinne Loves Xor
    Labyrinth CodeForces
    Nastya and Scoreboard
    Teacher Bo HDU
    Blood Cousins Return
    D Tree HDU
    设计模式学习笔记(八、行为型-策略模式)
  • 原文地址:https://www.cnblogs.com/wuxiexy/p/12970448.html
Copyright © 2011-2022 走看看