确定一个数是否为斐波那契数的java
我需要编写一个Java代码来检查用户输入的数字是否在斐波那契序列中
我对将斐波那契数列写入输出没有异议,但(可能是因为它在深夜)我很难思考“是否”是斐波那契数的序列。我一次又一次地开始。这真让我头疼
我现在拥有的是第n个
public static void main(String[] args)
{
ConsoleReader console = new ConsoleReader();
System.out.println("Enter the value for your n: ");
int num = (console.readInt());
System.out.println("\nThe largest nth fibonacci: "+fib(num));
System.out.println();
}
static int fib(int n){
int f = 0;
int g = 1;
int largeNum = -1;
for(int i = 0; i < n; i++)
{
if(i == (n-1))
largeNum = f;
System.out.print(f + " ");
f = f + g;
g = f - g;
}
return largeNum;
}
# 1 楼答案
如果我理解正确,你需要做的(不是写出第一个n斐波那契数)是确定n是否是斐波那契数
因此,您应该修改方法,以继续生成斐波那契序列,直到得到一个数字>;=n、 如果它等于,n是斐波那契数,否则不是
更新:由于@Moron一再声称基于公式的算法在性能上优于上面简单的算法,我实际上做了一个基准比较——具体地说是雅格布的解决方案作为生成器算法和史蒂文的上一个版本作为基于公式的算法。以下是准确的代码供参考:
结果连我都感到惊讶:
简而言之,生成器算法在所有正int值上都优于基于公式的解决方案——即使接近最大int值,其速度也要快一倍多! 基于信念的性能优化到此为止;-)
作为记录,修改上述代码以使用
long
变量而不是int
,生成器算法会变慢(正如预期的那样,因为它现在必须将long
值相加),公式开始变快的转换点约为10000000000L,即1012更新2:正如IVlad和Moron所指出的,我不是浮点计算方面的专家:-)根据他们的建议,我将公式改进为:
这将切换点降低到大约108(对于
long
版本,对于所有int值,带有int
的生成器速度更快)。毫无疑问,将sqrt
调用替换为@Moron建议的调用将进一步降低切换点我(和IVlad)的观点很简单,总是会有一个转换点,低于这个转换点,生成器算法会更快。因此,关于哪一个表现更好的说法在总体上没有意义,只是在一定的背景下
# 2 楼答案
有许多方法可以用来确定给定的数字是否在斐波那契序列中,可以在wikipedia上看到其中的一个选择
然而,考虑到你已经做过的事情,我可能会使用一种更暴力的方法,例如:
我可能会使用递归方法,传入当前的n值(即,它计算第n个斐波那契数)和目标数
# 3 楼答案
阅读wikipedia上标题为“识别斐波那契数”的部分
或者,你可以继续生成斐波那契数,直到其中一个等于你的数:如果是,那么你的数就是斐波那契数,如果不是,这些数最终会大于你的数,你可以停止。然而,这是相当低效的