Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
斐波那契序列-查找位数-JavaScript_Javascript_Fibonacci_Notation_Scientific Notation - Fatal编程技术网

斐波那契序列-查找位数-JavaScript

斐波那契序列-查找位数-JavaScript,javascript,fibonacci,notation,scientific-notation,Javascript,Fibonacci,Notation,Scientific Notation,因此,我已经成功地编写了斐波那契序列来创建一个带有数字序列的数组,但是我需要知道第500个数字的长度(有多少位) 我试过下面的代码,但是它找到了科学符号的长度(22位),而不是它应该返回的正确的105位 你知道如何将科学符号数字转换成实际整数吗 var fiblength = function fiblength(nth) { var temparr = [0,1]; for(var i = 2; i<=nth; i++){ var prev = tempa

因此,我已经成功地编写了斐波那契序列来创建一个带有数字序列的
数组
,但是我需要知道
第500个
数字的长度(有多少位

我试过下面的代码,但是它找到了科学符号的长度(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);
var fiblength=函数fiblength(n次){
var temparr=[0,1];

对于(var i=2;i大多数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;
};
函数长度(n){
var先前=0,电流=1,温度;

对于(var i=2;i为什么不使用简单的程序将数字除以10,直到数字小于1

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

我的最终解决方案
函数长度(n){
变量a=0,b=1,c;

对于(var i=2;i而言,问题在于,在进行任何有意义的计算之前,结果数字已转换为字符串。以下是如何在原始代码中解决该问题:

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) );
var fiblength=函数fiblength(n次){
var temparr=[0,1];
对于(变量i=2;i 1){
长度=长度+1;
x=x/10;
}
返回长度;
};
console.log(fiblength(500));

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

function fiblength(n) { 
   return Math.floor((n>1)?n*.2089+.65051:1); 
}
让我们解释一下我是怎么做到的

以前的所有解决方案可能都不适用于
N>300
,除非您有一个大数字库。而且它们非常不完善

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

F(n) = ABS((PHI^n)/sqrt(5))
其中,
PHI=1.61803399
(黄金比率,在整个斐波那契序列中都可以找到)

如果你想知道一个数字有多少位数,你可以计算以10为基数的对数,再加上1。让我们调用这个函数
D(n)=log10(n)+1

因此,您想要的
fiblength
就是在下面的函数中

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

让我们算出它,这样你就可以知道一旦你使用数学,一行代码会是什么样子

替换
F(n)

fiblength(n)=D(ABS(φ^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=0
n=1
的特殊情况以返回1

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


光纤长度(500)=>105
//无需迭代。

看看这是否有助于我混合东西…Bignum库可能是OP需要的。@thefourtheye:什么意思,这里没有浮点数?JavaScript中的所有数字都是浮点数,甚至没有整数类型。@Amadan我指的是当前的问题。@thefourtheye:我仍然没有我不明白。当前的问题是关于JavaScript中的数字。JavaScript中的所有数字都是浮点数。因此,这里有浮点数。我缺少什么?或者你可以只得到10个底对数。
Math.floor(Math.log(n)/Math.log(10))+1应该足够了。我们开始吧。这是一个非常优雅的方法来让它工作…美丽:-)不是100%我需要的,但这是一个很好的跳板:-)谢谢!在一个循环中除以10,并添加一个计数器来跟踪它这样做的次数,这会起到作用。但是,非常欣赏最小化我的代码:-)我喜欢这个方法避免使用内置的数学函数来调整它。最后一个注意事项是,您需要执行return length-1;以返回正确的值;-)
F(n) = ABS((PHI^n)/sqrt(5))
function fiblength(n) { 
   return Math.floor((n>1)?n*.2089+.65051:1); 
}