2017-06-12 3 views
-4

J'essaye d'écrire une fonction qui prend une liste d'entiers et trouve toutes les séquences arithmétiques dedans. A = [-1, 1, 3, 3, 3, 2, 1, 0] Il y a cinq séquences arithmétiques dans cette liste: (0, 2), (2,4), (4, 6, 0, 6, 6, 6, 9).), (4,7), (5,7) - ce sont des indices du premier et du dernier élément d'une séquence. Une séquence est dérivée de la différence entre les éléments.Séquence de tranches arithmétiques dans C

Comme vous le voyez dans l'exemple ci-dessus - la séquence doit être plus longue que 2 éléments (sinon, elle trouverait une séquence entre deux éléments).

La fonction que je dois écrire doit retourner le nombre de séquences qu'il trouve sur la liste - dans ce cas, il doit retourner 5.

Je suis un peu coincé - essayé quelques approches différentes, mais a lamentablement échoué . La dernière chose que j'ai faite est:

#include<stdio.h> 

int main() { 
    // your code goes here 
    long int A[]={-1, 1, 3, 3, 3, 2, 1, 0}; 
    //int N= sizeof(A)/sizeof(A[0]); 
    int N=8; 
    printf("%d", solution(A,N)); 
    return 0; 
} 


int solution (long int A[], int N) 
{ 
    int numSlices=0; 

    int tot; 
    // Get the Consecutive Array 
    for(int iOut=0; iOut<N; iOut++) 
     { 
     int startIndex = iOut; 
     int endIndex; 
     long int diff; 
     for(int iIn=iOut; iIn<N-2; iIn++) 
      { 
      if((A[iIn]-A[iIn+1]) == (A[iIn+1]-A[iIn+2])) 
      continue; 
      else 
       { 
       endIndex = iIn+1; 
       iOut=endIndex+1; 
       printf ("SI = %d \t EI = %d \n", startIndex, endIndex); 
       break; 
       } 
      } 

     int ln=endIndex - startIndex; 
     if (ln >=3) 
     numSlices +=(ln-2)* (ln-1); 
     // 1* 
    } 
return numSlices; 
} 
+3

* "Échoué lamentablement" * ne définit pas exactement ce qui s'est mal passé. L'esprit étant plus clair? – CinCout

+1

Et comment est-il étiqueté à la fois 'C' et' C++ '? Ce sont deux langues * différentes *. – CinCout

Répondre

0

Voici une approche plus simple. J'ai placé des commentaires pour vous aider à comprendre.

int solution (long int A[], int N) 
{ 
    int i; 
    int count = 0; 
    for (i = 0; i < N - 1; i++) { 
     int diff = A[i + 1] - A[i]; // get the difference of the current number to the next 
     int temp = i + 1; 
     // continue expanding the sequence as long as the difference is still the same 
     while (temp < N - 1 && A[temp + 1] - A[temp] == diff) { 
      count++; 
      printf("Sequence found: %d, %d\n", i, temp); // display the sequence 
      temp++; 
     } 
    } 
    return count; 
} 
+0

Merci pour l'aide rapide @ Thomas James. Quand j'ai essayé d'exécuter ce code, en dessous de l'erreur, je reçois .. aucune idée? erreur: les déclarations initiales de la boucle 'for' ne sont autorisées qu'en mode C99 pour (int i = 0; i Raj

+0

Cela ne donne pas le bon résultat dans le cas de test. –

+0

Merci. J'ai édité une fois de plus. Je pensais que nous n'avions que la séquence la plus longue, mais il semble que nous devrions tout obtenir. Désolé pour l'oubli. –