Fibonacci序列中的第n个数字

时间:2014-10-31 20:42:12

标签: java while-loop

我不知道如何打印,在fibonacci序列中的数字是(第n个数字)。粗体文本是我遇到的麻烦,我必须使用while循环。

请输入分析编号>> 1 1是Fibonacci数,序列中的顺序为2和3。

请输入分析编号>> 56 55不是斐波纳契数。 但是56在11到12之间。

这是我的代码

import java.util.Scanner;
public class While
{
public static void main(String[] args) 
{
System.out.println("Welcome to the Fibonacci Sequence Detector\n\n");
Scanner in = new Scanner(System.in);    
System.out.print("Please input a number for analysis: ");
int input = in.nextInt();

int fib = 0;
int fib1 = 1;
int n;
while(true)
{
    n=fib+fib1;
    if(input == fib1)
    {
        fib = -1;
        break;
    }
    if(input>fib1 && input < n)
    {
        break;
    }
    fib = fib1;
    fib1=n;
}
if (fib == -1 || input == 0)
    System.out.println(input+" is a Fibonacci number whose order in the sequence is " );
    else
    System.out.println(input+ " is not a Fibonacci number" );


} 
}

2 个答案:

答案 0 :(得分:0)

我能想到的最简单的方法是拥有一个每次都递增的计数器变量。

while(true) {
    count++;
...
}
...
System.out.println(input+" is a Fibonacci number whose order in the sequence is "+count);

作为旁注,您是否有理由使用while(true)?通常有一种方法可以跟踪您想要停止循环的条件。 (我被告知while(true)并不总是错的,但通常是。):))

答案 1 :(得分:0)

Fibonacci序列有一个封闭形式,因此无需搜索您感兴趣的数字。可以直接计算n th Fibonacci数,并找出序列中给定数字的位置。

public class Fibi {
    public static void main(String[] args) {
        double root5 = Math.sqrt(5);
        double phi = (1.0 + root5) / 2.0;
        double log_phi = Math.log(phi);

        for (String s : args) {
            long fib = Long.parseLong(s);
            long n = (long) Math.floor(Math.log(fib * root5) / log_phi);
            long nth = Math.round(Math.pow(phi, n) / root5);
            long next = Math.round(Math.pow(phi, n+1) / root5);
            if (fib == nth) {
                System.out.printf("%d is a Fibonacci number whose order is %d.%n",
                    fib, n);
            } else if (fib == next) {
                System.out.printf("%d is a Fibonacci number whose order is %d.%n",
                    fib, n+1);
            } else {
                System.out.printf("%d is not a Fibonacci number. " +
                    "However, %d is between %d and %d.%n", fib, fib, n, n+1);
            }
        }
    }
}

如果您使用java Fibi 102334155运行此程序,则输出:

102334155 is a Fibonacci number whose order is 40.

请注意,我没有实现1,它在序列中出现两次,可以很容易地作为特例处理,我稍微改变了索引的编号。你在第2和第3位有1,在第11位有55,这意味着你正在考虑0是Fibonacci序列中的第一个数字,我通常看到它定义为从1 1开始。但是,这可以通过微小的改变来处理。