0

创建一个程序,找出斐波那契数列中出现的第一个大于 1 的完全平方并将其显示到控制台。

输入输入时没有输出。

#include <stdio.h>
#include <math.h>

int PerfectSquare(int n);
int Fibonacci(int n);

main()
{
    int i;
    int number=0;

    int fibNumber=0;
    int psNumber=0;


    printf("Enter fibonacci number:");
    scanf("%i",&number);


    fibNumber = Fibonacci(number);

    psNumber = PerfectSquare(fibNumber);

    if(psNumber != 0){
        printf("%i\n",psNumber);
    }
}



int PerfectSquare(int n)
{

    float root = sqrt(n);
    if (n == ((int) root)*((int) root))
        return root;
    else
        return 0;
}

int Fibonacci(int n){
    if (n==0) return 0;
    if (n==1) return 1;
    return( Fibonacci(n-1)+Fibonacci(n-2) );
}
4

3 回答 3

0

第一个建议是摆脱递归以创建 fib 数字。您可以使用 2 个变量并持续跟踪最后 2 个 fib 数字。他们会添加如下内容:

fib1=0;fib2=1;
for(i=3;i<MAXTOCHECK;i++)
{
    if(fib1<fib2)
        fib1+=fib2;
    else
        fib2+=fib1;
}

这种方法的好处在于,首先您可以将种子更改为您想要的任何内容。很高兴找到类似 fib 的序列。例如,卢卡斯数字以 2 和 1 为种子。其次,您可以将检查平方内联,而不是每次都完全重新计算序列。

注意:如前所述,您的索引可能已关闭。从最初的播种方式索引 fib 数字存在一些任意性。如果您使用 1 和 1 重新播种,则可以看到这一点。您会得到相同的序列移动了 1 个索引。因此,请确保您使用一致的定义来索引序列。

于 2012-12-03T13:56:37.063 回答
0

现在你只计算一个斐波那契数,然后测试它是否是一个完美的正方形。要正确执行此操作,您必须使用循环。

于 2012-11-19T01:55:18.863 回答
0

卢克是对的。如果您的输入是 n,则 Fibonacci(n) 返回第 (n+1) 个 Fibonacci 数。您的程序实际上检查 (number +1)th 是否是完全平方。

如果输入 12,则有输出。因为第 13 个斐波那契数是 144。它是完美的正方形。PS:打印 fibNumber 而不是 psNumber。

        printf("%i\n", fibNumber);
于 2012-11-19T02:57:50.917 回答