斐波那契序列-查找位数-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);
}