Fibonacci序列 - 查找位数 - JavaScript

时间:2013-12-22 05:33:30

标签: javascript fibonacci notation scientific-notation

所以,我已经成功编写了 Fibonacci序列来创建一个带有数字序列的array,但我需要知道长度(多少位数)500th号码。

我已经尝试了下面的代码,但它找到了科学记数法的长度(22位数),而不是应该返回的正确的105.

如何将科学记数法转换为实际整数?

var fiblength = function fiblength(nth) {
    var temparr = [0,1];
    for(var i = 2; i<=nth; i++){
        var prev = temparr[temparr.length-2],
            cur = temparr[temparr.length-1],
            next = prev + cur;
            temparr.push(next);
    }
    var final = temparr[temparr.length-1].toString().length;
    console.log(temparr[temparr.length-1]);
    return final;
};
a = fiblength(500);
console.log(a);

5 个答案:

答案 0 :(得分:8)

为什么不使用将数字除以10的简单程序,直到数字小于1。

这样简单应该可以工作(递归def obv也可以)

function getDigits(n) {
   var digits = 0;
   while(n >= 1) {
      n/=10;
      digits += 1;
   }
   return digits;
}

getDigits(200);//3
getDigits(3.2 * 10e20);//=>22

答案 1 :(得分:2)

这是一个恒定时间的解决方案:

function fiblength(n) { 
   return Math.floor((n>1)?n*.2089+.65051:1); 
}

让我们解释一下我是如何到达它的。

以前的所有解决方案都可能不适用于N>300,除非你有一个BigNumber库。他们也非常有用。

有一个公式可以得到任何斐波纳契数,它使用PHI(黄金比率数字),非常简单:

F(n) = ABS((PHI^n)/sqrt(5))

PHI=1.61803399(黄金比率,遍布斐波那契序列)

如果您想知道一个数字有多少位数,您可以计算日志基数10并将其加1。我们称之为函数D(n) = log10(n) + 1

所以你想要的fiblength只是以下函数

fiblength(n) = D(F(n)) //斐波那契数字的位数......

让我们解决这个问题吧,一旦你使用数学,你就会看到一个班轮代码是什么样的。

替换F(n)

fiblength(n) = D(ABS((PHI^n)/sqrt(5)))

现在应用D(n):

fiblength(n) = log10(ABS((PHI^n)/sqrt(5))) + 1

所以,因为log(a/b) = log(a) - log(b)

fiblength(n) = log10(ABS((PHI^n))) - log10(sqrt(5))) + 1

以及log(a^n) = n * log(a)

fiblength(n) = n*log10(PHI) - log10(sqrt(5))) + 1

然后我们评估这些对数,因为它们都是常数 并添加n=0n=1的特殊情况以返回1

function fiblength(n) { 
   return Math.floor((n>1)?n*.2089+.65051:1); 
}

享受:)

fiblength(500) => 105 //无需迭代。

答案 2 :(得分:1)

大多数javascript实现,内部使用64位数字。因此,如果我们试图表示的数字非常大,则使用科学记数法来表示这些数字。因此,没有纯粹的“基于javascript号码”的解决方案。您可能需要寻找其他BigNum库。

就您的代码而言,您只需要第500个数字,因此您不必将整个数字数组存储在内存中,只需要上一个和当前数字即可。

function fiblength(nth) {
    var previous = 0, current = 1, temp;
    for(var i = 2; i<=nth; i++){
        temp = current;
        current = previous + current;
        previous = temp;
    }
    return current;
};

答案 3 :(得分:0)

我的最终解决方案

function fiblength(nth) {
    var a = 0, b = 1, c;
    for(var i=2;i<=nth;i++){
        c=b;
        b=a+b;
        a=c;
    }
    return Math.floor(Math.log(b)/Math.log(10))+1;
}
console.log(fiblength(500));

感谢您的帮助!!!

答案 4 :(得分:0)

问题是因为在进行任何有意义的计算之前,结果数字被转换为字符串。以下是原始代码中可以解决的问题:

var fiblength = function fiblength(nth) {
    var temparr = [0,1];
    for(var i = 2; i<=nth; i++){
        var prev = temparr[temparr.length-2],
            cur = temparr[temparr.length-1],
            next = prev + cur;
            temparr.push(next);
    }
    var x = temparr[temparr.length-1];
    console.log(x);
    var length = 1;
    while (x > 1) {
        length = length + 1;
        x = x/10;
    }
    return length;
};

console.log ( fiblength(500) );