如何使此代码适用于更大的数字?

时间:2012-07-31 17:30:40

标签: javascript

此代码应该简化分数并将小数转换为分数,但是当我放入具有较大分数(数字超过7或8位数)的分数时,它会滞后很多。

http://jsfiddle.net/SuperBoi45/vQjgx/

var fraction = {};

fraction.simplify = function( frac ) {
    if ( frac.indexOf('/') < 0 ) return frac;
    var numbers = frac.split('/'),
        factor = null,
        parsed = null;

    return (function run( nums ) {
        factor = fraction.factor( nums[0], nums[1] );

        if ( factor === 1 ) {
            parsed = [ Math.abs(nums[0]), Math.abs(nums[1]) ];

            if ( nums[1] === 1 ) return nums[0];
            else if ( nums[1] === -1 ) return -nums[0];
            else if ( nums[0] < 0 && nums[1] < 1 ) return parsed[0] + '/' + parsed[1];
            else if ( nums[0] < 0 || nums[1] < 0 ) return '-' + parsed[0] + '/' + parsed[1];
            else return nums[0] + '/' + nums[1];
        }

        return run( [ nums[0] / factor, nums[1] / factor ] );
    })( numbers );
};
fraction.convert = function( decimal ) {
    var j = decimal.length - 1,
        b = "1";

    if ( decimal.indexOf(".") >= 0 && decimal.length > 1 ) {

        while ( decimal.charAt( j ) != "." ) {
            b += "0";
            j--;
        }

        decimal *= b;
        decimal += "/" + b;

    }

    return decimal;

};
fraction.factor = (function() {

    var greater = function( a, b ) {
        return a > b ? a : b;
    };

    return function( x, y ) {
        x = Math.abs( x );
        y = Math.abs( y );

        var a = greater( x, y ),
            i = a,
            b = ( i === x ) ? y : x;

        for ( ; i >= 1; i-- ) {
            if ( a % i === 0 && b % i === 0 ) return i;
        }

        return 1;
    };

})();​

我试图让它像Wolfram Alpha一样工作,因为你可以放入具有大分数的分数,并且在向你展示其快速渲染结果时不会冻结一点。

http://wolframalpha.com/

任何人都可以修复此代码以使用更大的数字。我想你必须使用与我不同的算法。另一方面,有没有人知道WA的算法或者可以将我引导到我能找到的网站?

1 个答案:

答案 0 :(得分:2)

fraction.factor()替换为:

function gcd(a, b) {
    if (b > a) return gcd(b, a);
    if (b === 0) return a;
    return gcd(b, a % b);
};

那是Euclid的算法,它可以作为数论的一个很好的介绍。它比你的迭代方法更快地运行方式