【问题标题】:Fibonacci calculation斐波那契计算
【发布时间】:2013-03-31 08:14:53
【问题描述】:

这个程序应该从用户那里得到一个斐波那契数,程序将计算它是什么,同时确保用户输入一个正数和一个不小于斐波那契数 70 的数字。所以,如果用户输入7,它应该打印 13。 fibcalc() 方法应该进行计算。 当我尝试编译程序时,我收到错误“斐波那契类中的方法 fibcalc 不能应用于给定类型:System.out.printf("Fibonacci #%d is %f", num, fibcalc(num, x3)); 和“找不到符号”return x3;这是我的代码:

import java.util.Scanner;

public class Fibonacci
{
    public static void main ( String args[] ) 
    {
    Scanner input = new Scanner ( System.in );

        int num; 
        double x3 = 0;


           System.out.print("Which Fibonacci number would you like? ");
       num = input.nextInt(); 
           do
       {
        System.out.print("Which Fibonacci number would you like? ");
        num = input.nextInt(); 
    }while(num >= 0 && num <= 70);

    System.out.printf("Fibonacci #%d is %f", num, fibcalc(num, x3));

}


public static double fibcalc(int num) 
{
    int x1 = 0;
    int x2 = 1;

        if (num == 0)

            return 0;

        else if (num == 1)

            return 1;

        else

            for (int x3 = 0; x3 < num; x3++)
                {
                    x3 = x1 + x2;
                    x1 = x2;
                    x2 = x3;
                }
                return x3;

}
  }

我可能还漏掉了其他问题。我对java很陌生。提前致谢。

【问题讨论】:

  • x3 在 for 循环之外不存在
  • 所以不是在循环中声明 x3 我会在外面声明它?
  • 是的,在外部声明它修复了该错误。

标签: java numbers fibonacci


【解决方案1】:

您还可以使用以下计算器计算斐波那契数列(使用 Javascript):enter link description here

【讨论】:

  • 您好,虽然提供另一个帖子的链接是有益的,但答案应该包含解决方案。请添加更多详细信息。
【解决方案2】:

fibcalc() 方法有一个 int 参数,但您使用 两个 参数调用它。

更改呼叫来源

fibcalc(num, x3)

fibcalc(num)

即将该行更改为:

System.out.printf("Fibonacci #%d is %f", num, fibcalc(num));

另外,如果您想要准确的结果数字,请从使用 double 更改为使用 BigInteger,它可以准确处理任意大的数字。

【讨论】:

    【解决方案3】:

    如果要计算斐波那契数,可以使用直接(非递归、非迭代)formula for Fibonacci numbers

    Fib(n) = (pow((1+sqrt(5))/2, n) + pow((1-sqrt(5))/2, n)) / sqrt(5)
    

    事实证明,对于所有n &gt;= 0,您可以将这个公式简化为:

    Fib(n) = round(pow((1+sqrt(5))/2, n) / sqrt(5))
    

    知道了这一点,您可以对fibcalc 使用以下简单实现:

    public static double fibcalc(int num) {
        return Math.floor(Math.pow((1+Math.sqrt(5))/2, num) / Math.sqrt(5) + 0.5);
    }
    

    【讨论】:

    • 我尝试实现这一点并得到错误“找到可能的精度要求 int:long。我应该将 public static int 更改为 public static long 吗?
    • 这很奇怪。在我的示例中,任何地方都没有long。查看IdeOne.com 上的这个工作示例。它编译时没有警告并且工作正常
    • 我不确定我是否正确使用它。如果我输入任何高于 70 的值,它会给我一个奇怪的答案,这是不应该的。
    • @user1858350:我已经更新了我的答案以使用Math.floor(x+0.5)double 类型)而不是Math.round(x)long 类型) - 这在 n>92 之后出现故障。现在它适用于n,远远超出100ideone demo
    猜你喜欢
    • 1970-01-01
    • 2020-01-18
    • 2012-12-03
    • 2016-08-04
    • 1970-01-01
    • 2016-12-11
    • 2016-07-29
    • 2017-11-18
    • 2020-04-02
    相关资源
    最近更新 更多