斐波纳契序列中的完美正方形?

时间:2012-11-19 01:48:00

标签: c fibonacci perfect-square

创建一个程序,找出Fibonacci序列中出现的大于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) );
}

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

卢克是对的。如果输入为n,则Fibonacci(n)返回第(n + 1)个Fibonacci数。 你的程序检查(数字+1)是否是完美的正方形。

如果输入12,则输出。因为第13个Fibonacci数是144.它是完美的正方形。 PS:print fibNumber而不是psNumber。

        printf("%i\n", fibNumber);

答案 2 :(得分:0)

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

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

这种方法的好处在于,首先你可以将种子改为你想要的任何东西。这很好找到像序列一样的纤维。例如,Lucas数字用2和1播种。其次,你可以检查方形内联,而不是每次都完全重新计算序列。

注意:如前所述,您的索引可能已关闭。从最初播种的方式索引fib数有一定的随意性。如果您使用1和1重新设置,则会看到这种情况。您可以将相同的序列移动1个索引。因此,请确保使用一致的定义来索引序列。