Java 模m的斐波那契n

Java 模m的斐波那契n,java,arrays,algorithm,fibonacci,Java,Arrays,Algorithm,Fibonacci,我正在计算以下是对您的两个异常/错误的解释 OutOfMemoryError异常:由于您试图创建一个巨大的数组,远远超过了可能的大小。参考这个问题 NegativeArraySizeException:由于您正在将一个long转换为一个整数(代码long[]arr=new long[(int)n+1];)。请阅读以下内容:。(基本上,您在某个点溢出,得到的整数是负数) 以下是对您的两个例外/错误的解释 OutOfMemoryError异常:由于您试图创建一个巨大的数组,远远超过了可能的大小。参考

我正在计算以下是对您的两个异常/错误的解释

  • OutOfMemoryError异常:由于您试图创建一个巨大的数组,远远超过了可能的大小。参考这个问题
  • NegativeArraySizeException:由于您正在将一个long转换为一个整数(代码
    long[]arr=new long[(int)n+1];
    )。请阅读以下内容:。(基本上,您在某个点溢出,得到的整数是负数)

  • 以下是对您的两个例外/错误的解释

  • OutOfMemoryError异常:由于您试图创建一个巨大的数组,远远超过了可能的大小。参考这个问题
  • NegativeArraySizeException:由于您正在将一个long转换为一个整数(代码
    long[]arr=new long[(int)n+1];
    )。请阅读以下内容:。(基本上,您在某个点溢出,得到的整数是负数)

  • 如果
    n
    可以10^18,那么即使您不使用数组,它仍然会超时,因为您将运行循环直到
    n
    (即10^18)来计算第n个斐波那契数

    可以使用矩阵求幂法(线性递归法)。你可以在博客中找到详细的解释和程序。运行时间为
    O(log n)


    希望这有帮助

    如果
    n
    可以10^18,那么即使您不使用数组,它仍然会超时,因为您将运行循环直到
    n
    (即10^18)来计算第n个斐波那契数

    可以使用矩阵求幂法(线性递归法)。你可以在博客中找到详细的解释和程序。运行时间为
    O(log n)


    希望这有帮助

    您的代码有两个问题

  • 为了计算元素n,只需要知道斐波那契元素n-1和n-2,所以不需要数组,只需要两个变量
  • 由于(a+b)%m==(a%m+b%m),您可以从n-1和n-2个元素的模m计算第n个元素的模m。事实上,你不可能在很长的时间内存储10^18的斐波那契数,因为它的值很大——斐波那契序列呈指数增长。 您可能遇到的唯一问题是,如果a%m+b%m溢出,那么您应该将m限制为Long.MAX\u VALUE/2,因为您不知道实际元素的大小,只知道n。或者,您也可以在函数中添加溢出检查

  • 您的代码有两个问题

  • 为了计算元素n,只需要知道斐波那契元素n-1和n-2,所以不需要数组,只需要两个变量
  • 由于(a+b)%m==(a%m+b%m),您可以从n-1和n-2个元素的模m计算第n个元素的模m。事实上,你不可能在很长的时间内存储10^18的斐波那契数,因为它的值很大——斐波那契序列呈指数增长。 您可能遇到的唯一问题是,如果a%m+b%m溢出,那么您应该将m限制为Long.MAX\u VALUE/2,因为您不知道实际元素的大小,只知道n。或者,您也可以在函数中添加溢出检查

  • 你能告诉我们序列中的前10个数字吗?数组大小似乎是由
    Integer.MAX\u VALUE
    所限定的。使用
    10^18
    作为
    n
    的值(远大于
    2^32
    )会导致错误。您可能不需要数组来计算第n个斐波那契数。尝试
    private static long getfibonaccihugfast(long n,long m){long first=0;long second=1;long value=0;for(int i=2;i
    你能给我们看一下序列中的前10个数字吗?数组大小似乎受
    整数的限制。最大值
    如前所述。使用
    10^18
    作为
    n
    的值(远大于
    2^32
    )会导致错误。您可能不需要数组来计算第n个斐波那契数。尝试
    private static long getfibonaccihugfast(long n,long m){long first=0;long second=1;long value=0;for(int i=2;i