大斐波那契数的最后一位快速算法
Last Digit of a Large Fibonacci Number fast algorithm
我正在尝试使用 java 求解斐波那契数列,但我的代码需要很长时间才能处理大数。
问题描述
任务。给定一个整数 ,找到 th
斐波那契数 </code> 的最后一位(即 mod 10)。</p>
<p>输入格式。输入由一个整数组成。</p>
<p>约束。 <code>0 ≤ ≤ 10⁷.
输出格式。输出</code>.</p>的最后一位
<p><strong>我的代码:</strong></p>
<pre><code>public class FibonacciLastDigit {
private static int getFibonacciLastDigitNaive(int n) {
if (n <= 1) {
return n;
}
BigInteger first = BigInteger.ZERO;
BigInteger second = BigInteger.ONE;
BigInteger temp;
for (int i = 1; i < n; i++) {
temp = first.add(second);
first = second;
second = temp;
}
return second.mod(BigInteger.TEN).intValue();
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
System.out.println(getFibonacciLastDigitNaive(n));
}}
如果输入 = 613455,我的代码将失败,获取值需要 30 秒,允许的最大时间为 1.5 秒。
我不得不使用大整数,因为 long 不够用。
斐波那契数列的最后一位有一个循环。每 60 个数字重复一次。因此,只需构建前 60 个数字的最后一位数字的 table,然后对输入执行模 60 运算和 table 查找。
您可能会在任何在线(或离线)table 斐波那契数列中看到周期。最下面一个link。
为了构建table,对于每个计算出的数字,如果它超过 9,您可以减去 10,因为您只需要最后一位,并且每个数字的最后一位仅取决于两个数字的最后一位以前的数字。您可以使用 int
数学(您既不需要 long
也不需要 BigInteger
)。
您的实现确实很天真,因为您被要求获取斐波那契数的最后一位,而不是实际的斐波那契数本身。您只需要保留最后一位数字,其他数字无关紧要。
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
System.out.println(getFibonacciLastDigit(n));
}
private static int getFibonacciLastDigit(int n) {
if (n <= 1) {
return n;
}
int first = 0;
int second = 1;
int temp;
for (int i = 1; i < n; i++) {
temp = (first + second) % 10;
first = second;
second = temp;
}
return second;
}
py中的代码必须是
lookup = {0:0,1:1}
N = int(input())
for i in range(2,N+1):
lookup[i] = (lookup[i-1] + lookup[i-1])%10
print(lookup[N])
这里附上一个c++的程序,可以用java写程序的逻辑。通过这段代码,我们只需要找到第 60 个斐波那契数。而且这将执行得非常快,也不需要持有大量数字。
#include <iostream>
using namespace std;
long long int findOutTheFibonacciNumber(int n)
{
int number = n % 60;
if (number <= 1)
{
return number;
}
else
{
long long int a = 0;
long long int b = 1;
long long int c = 1;
for (int i = 2; i <= number; i++)
{
c = (long long)a + b;
a = b;
b = c;
}
return c % 10;
}
}
int main()
{
int n;
cin >> n;
cout << findOutTheFibonacciNumber(n);
return 0;
}
我正在尝试使用 java 求解斐波那契数列,但我的代码需要很长时间才能处理大数。
问题描述
任务。给定一个整数 ,找到 th
斐波那契数 </code> 的最后一位(即 mod 10)。</p>
<p>输入格式。输入由一个整数组成。</p>
<p>约束。 <code>0 ≤ ≤ 10⁷.
输出格式。输出</code>.</p>的最后一位
<p><strong>我的代码:</strong></p>
<pre><code>public class FibonacciLastDigit {
private static int getFibonacciLastDigitNaive(int n) {
if (n <= 1) {
return n;
}
BigInteger first = BigInteger.ZERO;
BigInteger second = BigInteger.ONE;
BigInteger temp;
for (int i = 1; i < n; i++) {
temp = first.add(second);
first = second;
second = temp;
}
return second.mod(BigInteger.TEN).intValue();
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
System.out.println(getFibonacciLastDigitNaive(n));
}}
如果输入 = 613455,我的代码将失败,获取值需要 30 秒,允许的最大时间为 1.5 秒。
我不得不使用大整数,因为 long 不够用。
斐波那契数列的最后一位有一个循环。每 60 个数字重复一次。因此,只需构建前 60 个数字的最后一位数字的 table,然后对输入执行模 60 运算和 table 查找。
您可能会在任何在线(或离线)table 斐波那契数列中看到周期。最下面一个link。
为了构建table,对于每个计算出的数字,如果它超过 9,您可以减去 10,因为您只需要最后一位,并且每个数字的最后一位仅取决于两个数字的最后一位以前的数字。您可以使用 int
数学(您既不需要 long
也不需要 BigInteger
)。
您的实现确实很天真,因为您被要求获取斐波那契数的最后一位,而不是实际的斐波那契数本身。您只需要保留最后一位数字,其他数字无关紧要。
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
System.out.println(getFibonacciLastDigit(n));
}
private static int getFibonacciLastDigit(int n) {
if (n <= 1) {
return n;
}
int first = 0;
int second = 1;
int temp;
for (int i = 1; i < n; i++) {
temp = (first + second) % 10;
first = second;
second = temp;
}
return second;
}
py中的代码必须是
lookup = {0:0,1:1}
N = int(input())
for i in range(2,N+1):
lookup[i] = (lookup[i-1] + lookup[i-1])%10
print(lookup[N])
这里附上一个c++的程序,可以用java写程序的逻辑。通过这段代码,我们只需要找到第 60 个斐波那契数。而且这将执行得非常快,也不需要持有大量数字。
#include <iostream>
using namespace std;
long long int findOutTheFibonacciNumber(int n)
{
int number = n % 60;
if (number <= 1)
{
return number;
}
else
{
long long int a = 0;
long long int b = 1;
long long int c = 1;
for (int i = 2; i <= number; i++)
{
c = (long long)a + b;
a = b;
b = c;
}
return c % 10;
}
}
int main()
{
int n;
cin >> n;
cout << findOutTheFibonacciNumber(n);
return 0;
}