如何解决减少此特定代码用于斐波那契数的时间的方法?
作为一个有趣的项目,我启动了此代码,在这里我想查找每次斐波那契数平方的最后一位。它工作正常,但我想减少它的时间...有什么建议吗?
琐事:我找到斐波那契数,平方,然后找到总和。
import java.util.*;
import java.math.*;
public class FibonacciSumSquares {
private static BigInteger getFibonacciSumSquares(int n) {
if(n<=2)return BigInteger.valueOf(n);
BigInteger sum = BigInteger.valueOf(2);
long last = 1,lastTwo = 1,current = 0;
BigInteger lastBigInteger = BigInteger.ONE;
BigInteger lastTwoBigInteger = BigInteger.ONE;
BigInteger currentBigInteger;
boolean isUsePrimary = true;
for (int i = 3; i <=n; i++) {
if (isUsePrimary){
current = last + lastTwo;
current = current * current;
if (String.valueOf(current).length()<12) {
lastTwo = last;
last = current;
sum = sum.add(BigInteger.valueOf(current));
} else {
isUsePrimary = false;
lastTwoBigInteger = BigInteger.valueOf(lastTwo);
lastBigInteger = BigInteger.valueOf(last);
currentBigInteger = lastBigInteger.add(lastTwoBigInteger);
currentBigInteger = currentBigInteger.pow(2);
sum = sum.add(currentBigInteger);
}
} //end of outer if
else {
currentBigInteger = lastBigInteger.add(lastTwoBigInteger);
lastTwoBigInteger=lastBigInteger;
currentBigInteger = currentBigInteger.pow(2);
lastBigInteger= currentBigInteger;
sum = sum.add(currentBigInteger);
}
}//end of for
return sum.remainder(BigInteger.valueOf(10));
}//end of function
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
System.out.println(getFibonacciSumSquares(n));
}
}
解决方法
哦,您只需要最后一位数字,这是经典的数学转折:-)
通常的问题是,如果只需要最后一位数字,则可以忽略之间的所有步长中的所有其他数字,只要它只是加法或乘法即可。
您的公式基本上是f(n + 2)= [f(n)+ f(n + 1)] ^ 2,为此,最后一位仅取决于先前结果的最后一位。另外,总和的最后一位数字仅取决于您添加的每个数字的最后一位数字。
因此您可以为每个当前值或总和值执行mod 10,并且您不需要BigInteger甚至不需要很长的时间,就可以使用int。
private static int getFibonacciSquaredSumMod10(int n) {
if (n <= 1)
return n;
int sum = 0;
int last = 1,lastTwo = 1,current = 0;
for (int i = 2; i <= n; i++) {
current = last + lastTwo;
current = (current * current) % 10;
lastTwo = last;
last = current;
sum = (sum + current) % 10;
}
return sum;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。