创建一个程序,找出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) );
}
答案 0 :(得分:0)
现在你只计算一个Fibonacci数,然后测试它是否是一个完美的正方形。要正确执行此操作,您必须使用循环。
答案 1 :(得分:0)
如果输入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个索引。因此,请确保使用一致的定义来索引序列。