2012-11-12 2 views
1
#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; 
} 

de ====================================== ===Problèmes avec la calculatrice de la série de fibonacci

ce code est de Fibonacci - pour vérifier ladite séquence Fibonnaci le nombre N est appartient. inutile de dire i ai problème - i 8 mis en entrée, ce qui est le ouptut:

8 est l'élément de 4201440e de la séquence F1 = F0 = 1. 4201534 séquences ont été vérifiées.

comment diable cela se produit ...

BTW - exécuter Windows 7 64 bits sur mon pc latop, et exécuter l'éclipse c/C++

Merci pour les merveilleux aides Que Dieu bénisse leur âme

+0

Désolé pour le mauvais code d'origine. je pensais et est pour cela ?? – galgal

+0

met la fonction fabs là – dreamcrash

+0

Vous avez un plus} après la deuxième comparaison –

Répondre

0

Votre code est déroutant. Essayez d'écrire du code plus simple, cela vous aidera. Un autre pense dans votre pour vous avez la condition suivante F0 + F0> fabs (N) cela signifie que vous êtes calcul pour chacun pour l'itération fab (N), avec est inefficace/redondant, juste faire int x = fab (N) avant le boucle, et mettre sur la condition de boucle F0 + F0> x, la même chose pourrait s'appliquer à F0 + F0.

Je pense qu'il vous est préférable de de recevoir le N et on calcule le Fibonacci et vérifiez en même temps si elle est réelle terme égal à votre valeur comme celui-ci.

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. 
} 
1

Vous n'initialisez pas vos variables, en particulier num_of_seqs_tested et serial_position_of_N sont utilisés sans être initialisées.

scanf("%u", &N); 

est incorrect, puisque N est un signé int (il fonctionne toujours si vous entrez des nombres non négatifs <= INT_MAX, probablement). Si vous entrez 8, vous exécutez le chemin de code

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){ 

et depuis 1 + 1 < 8, la boucle ne fonctionnera jamais. Vous avez probablement voulu utiliser < au lieu de >.

Notez cependant que

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

ne produit rien qui ressemble à la séquence de Fibonacci, après la première mise à jour dans la boucle, vous aurez les l = 2*k invariantes (jusqu'à l déversoirs).

Questions connexes