ti posto la mia soluzione, che alla fine è la tua solo un pò modificata! fammi sapere se va bene questo ragionamento...per quanto riguarda la complessità, bhè penso che questo algoritmo sia lineare, anche se mi sa che nel caso tuo si deve tenere conto dei confronti che si effettuano! giusto?
Nella Relazione si deve riportare l’analisi della
complessità di tempo dell’algoritmo (operazione dominante: confronto)
codice:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define KO -1
void fibo(int array[]);
int appartiene(int chiave,int a[],int n);
int findMax ( int* a, int n, int* );
int main()
{
int n=24,array[25],k[25],h=0,i,app=0,chiave, max, min=10000;
fibo(array);
for (i=0;i<=25;i++) k[i]=0;
srand ((unsigned int)time(0));
for(i=1;i<=10000;i++){
chiave = rand() % 20001;
app=appartiene(chiave,array,n);
h=app+h;
if (app != KO) k[app]=k[app]+1; //contattore si incrementa all'indice del fibonacci trovato
}
for (i=0;i<=25;i++)
printf(" %d\t %d \n",i,k[i]);
max = findMax ( k, n, &min );
if ( max == 0 ) {
printf ("Non e uscito nessun numero di Fibonacci!\n");
return KO;
}
printf ("Frequenze:\n");
for ( i=0; i<=25; i++ ) {
if ( k[i] == max ) {
printf ("Massima frequenza: %d \t %d\n", i, array[i] );
}
if ( k[i] == min ) {
printf ("Minima frequenza: %d \t %d\n", i, array[i] );
}
}
system ("pause");
return 1;
}
void fibo(int array[])
{
int i;
array[0]=0;
array[1]=1;
for( i=2; i<=22; i=i+1 )
array[i]=array[i-1]+array[i-2];
}
int appartiene(int chiave,int a[],int n)
{
int i;
i=0;
while ( i < n-1 ) {
if (chiave == a[i]) return i;
i = i+1;
}
return KO;
}
int findMax ( int* a, int n, int* min )
{
int i, max=0;
for ( i=0; i<=n; i++ ) {
if ( a[i] > max ) max = a[i];
if ( a[i] < *min && a[i]>0 ) *min = a[i];
}
return max;
}