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

現在、フィボナッチ数を1つだけ計算し、それが完全な正方形であるかどうかをテストしています。これを正しく行うには、ループを使用する必要があります。

于 2012-11-19T01:55:18.863 に答える
0

ルークは正しいです。入力がnの場合、フィボナッチ(n)は(n + 1)番目のフィボナッチ数を返します。プログラムは、(数値+1)番目が実際に完全な正方形であるかどうかをチェックします。

12と入力すると、出力があります。13番目のフィボナッチ数が144であるため。そして、それは完全な正方形です。PS:psNumberの代わりにfibNumberを出力します。

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

最初の提案は、再帰を取り除いてフィボナッチ数を作成することです。2つの変数を使用して、最後の2つのフィボナッチ数を継続的に追跡できます。次のようなものが追加されます。

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

この方法の良いところは、最初にシードを好きなように変更できることです。これは、fibのようなシーケンスを見つけるのに便利です。たとえば、リュカ数には2と1がシードされます。次に、正方形のインラインのチェックを入れて、毎回シーケンスを完全に再計算しないようにすることができます。

注:前述のように、インデックスがオフになっている可能性があります。フィボナッチ数を最初にシードする方法からインデックスを作成することには、ある程度の恣意性があります。これは、1と1で再シードした場合に見られます。同じシーケンスが1インデックスシフトされます。したがって、シーケンスのインデックス付けには一貫した定義を使用するようにしてください。

于 2012-12-03T13:56:37.063 に答える