我不知道如何打印,在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" );
}
}
答案 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
开始。但是,这可以通过微小的改变来处理。