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

int main(){

    int N,  k, l, F0,serial_position_of_N,num_of_seqs_tested,sign;

    printf("please insert a number:\n");
    fflush(stdout);
    scanf("%u", &N);

    //if N=0
    if( N == 0 ){
        printf("%d is the %dth item of the sequence F1 = F0 = %d.\n
            %d sequences were checked.\n", 0, 2, 0, 1);
            return 0;
    }

    //checks if N is odd or even
    if( N % 2 == 0 ){
        printf("N is and even number....\n\n");
        fflush(stdout);

      //if N is even
      for( F0 = 1; F0 + F0 > fabs( N ); ++F0, ++num_of_seqs_tested ){
          int pos;

          if( fabs( N ) == F0 ){
              pos = 2;
              break;
          }

          for( k = F0, l = F0, pos = 2; k+l > fabs( N ); k = l, l = k + l, pos++ ){
              if(k+l == fabs(N)){
          pos++;
          sign = 1;
          break;
          }
      }

      if( sign == 1 ){
          serial_position_of_N = pos;
          break;
      }
    }

    //if N is Odd
    else{
        printf( "N is and odd number....\n\n" );
        fflush( stdout );
        for( F0 = 1; F0 + F0 > fabs( N ); F0= F0 + 2, ++num_of_seqs_tested){
            int pos;

        if( fabs( N ) == F0 ){
            pos = 2;
            break;
        }

        for( k = F0, l = F0, pos = 2; k+l>fabs(N); k = l, l = k+l, pos++ ){

            if( k + l == fabs( N ) ){
                pos++;
                break;
            }

        }


        if( k+l == fabs( N ) ){
            serial_position_of_N = pos;
            break;
            }
        }
    }

//if N is negetive
    if( N < 0 ){
        printf("%d is the %dth item of the sequence F1 = F0 = %d.\n%d sequences were checked.\n", N, serial_position_of_N, (-1)*F0, num_of_seqs_tested);
        fflush(stdout);
    }

    //other
    printf( "%d is the %dth item of the sequence F1 = F0 = %d.\n%d sequences were checked.\n", N, serial_position_of_N, F0, num_of_seqs_tested );
    fflush(stdout);
    return 0;
}

=========================================

このコードはフィボナッチ用です - N 番目の数がどのフィボナッチ数列に属しているかを確認します。

言うまでもなく、問題があります-入力として8を入力すると、これが出力です:

8 は、シーケンス F1 = F0 = 1 の 4201440 番目のアイテムです。4201534 シーケンスがチェックされました。

ところで-ラップトップPCでWindows 7 64ビットを実行し、eclipse c/c ++を実行します

4

2 に答える 2

1

特に、変数を初期化num_of_seqs_testedserial_position_of_Nず、初期化せずに使用します。

scanf("%u", &N);

Nは符号付きであるため、正しくありません(おそらく、int負でない数値を入力しても機能します)。<= INT_MAX8 を入力すると、コード パスが実行されます

if( N % 2 == 0 ){
    printf("N is and even number....\n\n");
    fflush(stdout);

  //if N is even
  for( F0 = 1; F0 + F0 > fabs( N ); ++F0, ++num_of_seqs_tested ){

以来1 + 1 < 8、ループは決して実行されません。おそらく、<代わりにを使用するつもりでし>た。

ただし、

for( k = F0, l = F0, pos = 2; k+l > fabs( N ); k = l, l = k + l, pos++ ){

フィボナッチ数列に似たものは何も生成しません。ループの最初の更新後、 (オーバーフローl = 2*kするまで) 不変になります。l

于 2012-11-12T12:41:37.283 に答える
0

あなたのコードは紛らわしいので、もっとシンプルにしてください。forのもう 1 つの点として、次の条件があります。これは、 for eachをF0+F0>fabs(N)計算していることを意味します。これは、非常に非効率的/冗長です。ループの前に作って、ループ条件をつけるだけで、同じことが適用できますfab(N)int x = fab(N)F0+F0 > xF0+F0.

fibonacci関数が を受け取り、Nフィボナッチを計算し、実際の項が値と等しいかどうかを (同時に) 検証した方がよいでしょう。このようなもの:

int fibonacci(int n)
{
  int a = 0,b = 1, sum;
  int n_th = 1;
  int find = 0;
  int erro = 0; 
  while(!find && !erro)         // Search until it is find or a erro occurs.
  {
    if(a == n) find = 1;           // we find it;
    else if ( a > n) erro = 1;     // this means that N do not belong to fibonacci
    else n_th++;                   // increment the position of the term
    sum = a + b;                   // sum = the previous 2 terms
    a = b;                         // a takes the value of the actual term
    b = sum;                       // b becomes the next term
  }
  if(erro) return 0;               // Means that N do not belong to fibonacci.
  else return n_th;                // Gives the position.
}
于 2012-11-12T01:13:38.150 に答える