java - 两个连续斐波那契数的乘积 - 代码超时
问题描述
我正在尝试在 Java 中解决 Codewars 上连续 Fib 数字的乘积。示例测试运行良好,但是当我单击尝试时,它会超时。
我的错误可能是什么?
您可以在此处找到任务详细信息:https ://www.codewars.com/kata/product-of-consecutive-fib-numbers
public class ProdFib {
public static long[] productFib(long prod) {
int a = 0;
int ta, ta2= 0;
int a2 = 1;
while (a * a2 <= prod){
ta = a;
ta2 = a2;
a2 = a + a2;
a = ta2;
if(a * a2 == prod){
long[] re = new long[]{a,a2,1};
return re;
}
if(a * a2 > prod){
long[] re = new long[]{a,a2,0};
return re;
}
}
return null;
}
}
解决方案
您的问题是您将变量定义为int
而不是long
.
如果您尝试使用 prod 运行程序,44361286907595736L
它将进入无限循环。这样做的原因是当你将两个int
s 相乘时,结果也是一个int
。该产品是 165580141 和 267914296 相乘的结果。这些是合法的整数,但是当您将它们相乘时,这个数字对于整数溢出来说太大了。所以你得到一个比 低得多的数字44361286907595736L
。你的循环不会停止。
如果您将变量定义为long
,则不会发生这种情况。这是您的程序的可读性稍强的版本。
public static long[] productFib(long prod) {
long prev = 0;
long curr = 1;
long multiplied = prev * curr;
while (multiplied < prod) {
long temp = curr;
curr += prev;
prev = temp;
multiplied = prev * curr;
}
return new long[] { prev, curr, multiplied == prod ? 1 : 0 };
}
推荐阅读
- android - Bintray 上的 Android 库缺少源和 javadoc
- kotlin - 是否可以期望来自 AxonFramework 中非轴突类的调度命令
- python - 如何从Python列表中仅获取特定项目
- javascript - ajax post应用的问题
- elasticsearch - 如何将用户定义的字段和值添加到弹性搜索查询
- javascript - 为什么 string.replace(/./gm,function(s){...} 无法在 javascript 中使用“反引号”删除多行字符串中的换行符
- c++ - 从另一个基类初始化基类成员
- algorithm - 查找一个多边形是否包含另一个多边形的算法,当它们可能共享顶点时
- java - 如何从 Liquibase 更改日志为 Testcontainers 构建 Docker 映像?
- maven - 使用父 pom 调用时的 Maven 版本-maven-plugin NullPointerException