Codibility Ladder javascript-不理解一个细节,答案从37%跳到100%

Codibility Ladder javascript-不理解一个细节,答案从37%跳到100%,javascript,algorithm,Javascript,Algorithm,我试图解决所有关于可变性的课程,但在以下问题上我没有做到: 我已经在互联网上搜索过了,但我没有找到一个让我满意的答案,因为没有人回答为什么max变量会对结果产生如此大的影响 因此,在发布代码之前,我将解释一下想法 通过查看它,我不需要花太多时间来理解组合的总数,它是一个斐波那契数,并从斐波那契数组中删除0,我会很快找到答案 之后,他们告诉我们应该返回组合数模2^B[i] 到目前为止还不错,我决定在没有var max的情况下提交它,然后我得到了37%的分数。。我在互联网上到处搜索,100%的结果与

我试图解决所有关于可变性的课程,但在以下问题上我没有做到:

我已经在互联网上搜索过了,但我没有找到一个让我满意的答案,因为没有人回答为什么max变量会对结果产生如此大的影响

因此,在发布代码之前,我将解释一下想法

通过查看它,我不需要花太多时间来理解组合的总数,它是一个斐波那契数,并从斐波那契数组中删除0,我会很快找到答案

之后,他们告诉我们应该返回组合数模2^B[i]

到目前为止还不错,我决定在没有var max的情况下提交它,然后我得到了37%的分数。。我在互联网上到处搜索,100%的结果与我的相似,但他们添加了max=Math.pow(2,30)

有谁能向我解释一下马克斯是如何以及为什么对分数产生如此大的影响的

我的代码:

//将2幂加到num
功能功率(num){
返回Math.pow(2,num);
}
//返回包含除0以外的所有斐波那契数的数组
函数数组(num){
//const max=pow(30);->将这个max添加到fibonaccy数组中,得到的结果是100%
常数arr=[0,1,1];
设电流=2;

而(电流输入参数的限值为:

假设:

  • L是[1..50000]范围内的整数
  • 数组A的每个元素都是[1..L]范围内的整数
  • 数组B的每个元素都是[1..30]范围内的整数
因此
fibArray
中的数组
f
可以有50001长

斐波那契数呈指数增长;据统计,第50000个斐波那契数超过10000位

Javascript没有内置的对任意精度整数的支持,即使是双精度整数也只能提供约14 s.f.的精度。因此,通过修改代码,对于
L
的任何有效值,您都会得到“垃圾”值。这就是为什么您只得到30%的精度

但是为什么
max
是必要的呢?模数学告诉我们:

因此,通过将
%max
应用于迭代计算步骤
arr[current-1]+arr[current-2]
fibArray
中的每个元素成为其相应的Fib编号mod
max
,任何时候都不会有任何变量超过
max
的值(或内置整数类型):


请注意,由于
B[i]
永远不会超过30,
pow(2,B[i])这里有一个python 100%的答案,我希望能提供一个解释:-)

简而言之,对于某些数字,模数%类似于“按位and”。 任何数字%10都等于最右边的数字

284%10 = 4
1994%10 = 4
生活事实:

  • 对于2的倍数->X%Y等于X&(Y-1)
  • 当超大数组作为本课程的参数给出时,范围(1,31)中i的预计算(2**i)-1比计算B中的所有内容都要快
  • 因此fib(A[i])&pb[B[i]]比X%Y样式的东西计算起来更快
  • 为了完整性,代码在这里


    @meowgoesthedogfixed@mplungjan添加了控制台日志,并在链接到的页面后评论道:“不同方式的数量可能非常大,因此对于给定的整数P,返回模2^P的结果就足够了。”而且
    P
    永远不会大于30。你似乎忽略了
    B
    数组参数,你应该从中获取
    P
    。任何人都可以解释为什么会投反对票?这似乎是一个合法的问题。这正是我想要的答案。很遗憾,我不能为这一个两次投票给你。@pihh谢谢。希望最后一个P关于
    B[i]
    max
    的艺术对你来说很直观;更好的解释是
    %pow(2,i)
    相当于提取二进制模式中的第一个
    i
    位。因此提取30位的
    %max
    不会影响最终结果,因为
    %pow(2,B[i])
    也将最多提取30位。
    fibArray[2] = (fibArray[1] + fibArray[0]) % max = (F1 + F0) % max = F2 % max
    fibArray[3] = (F2 % max + F1) % max             = (F2 + F1) % max = F3 % max
    fibArray[4] = (F3 % max + F2 % max)             = (F3 + F2) % max = F4 % max
    and so on ...
    (Fn is the n-th Fib number)
    
    284%10 = 4
    1994%10 = 4