所以,我已经成功编写了 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);
答案 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=0
和n=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) );