PDA

Visualizza la versione completa : [C/C++]: Un problema iterativo e uno ricorsivo


Dario86ostia
18-09-2006, 20:57
Mi serve un algoritmo in c x questi problemi:

Ricorsivo:

Trovare un algoritmo ricorsivo che controlli se due naturali sono primi tra loro, vale a dire non hanno divisori primi in comune maggiori di 1. Si discuta caso base, caso ricorsivo e terminazione della ricorsione.

Iterativo:

Si disegni un algoritmo iterativo che ordini un vettore di interi posizionando prima tutti gli interi pari in ordine crescente, e quindi tutti gli interi dispari in ordine decrescente. Si discuta l'idea, mostrando le variabili coinvolte nei cicli, la loro inizializzazione, le condizioni di terminazione e la verifica della terminazione.


Se qualcuno ha un po di tempo mi faccia sapere :-)

Lak3d
18-09-2006, 23:58
Boh, io c'ho provato a risolverti il secondo problema, certo che non posso assicurarti che sia ottimizzato. Però pare funzioni...
Ah, funziona su un vettore di 10 interi, non saprei come renderlo parametrico... forse sizeof(NomeVettore)/sizeof(int)???



void swap(int * const Ptr, int * const Ptr2);
int Conta (int * const Ptr);

int main(){

int Vettore[10]={42,35,24,14,22,41,76,47,2,97};
int i,j,y,z;

for (i=0; i<=8; i++)
for (j=0; j<=8; j++)
if((Vettore[j]%2) > (Vettore[j+1]%2))
swap(&Vettore[j], &Vettore[j+1]);

for (y=0; y<=8; y++)
for (i=0; i<=8; i++)
if (Vettore[i+1]%2!=0){
i++;
break;}
else
if(Vettore[i]>Vettore[i+1])
swap(&Vettore[i], &Vettore[i+1]);

for (z=1; z<=8; z++)
for (j=i; j<=8; j++)
if(Vettore[j]<Vettore[j+1])
swap(&Vettore[j], &Vettore[j+1]);

for(i=0; i<=9; i++)
printf("%d ", Vettore[i]);

return 0;
}


void swap(int * const Ptr1, int * const Ptr2){
int temp;
temp=*Ptr2;
*Ptr2=*Ptr1;
*Ptr1=temp;
}

Lak3d
19-09-2006, 01:06
Eccolo parametrico... :)


#include <stdio.h>
#include <string.h>

void swap(int * const Ptr, int * const Ptr2);
int Conta (int * const Ptr);

int main(){

int Vettore[]={42,35,24,14,22,76,47,2,97,66,11,43};
int i,j,y,z;

for (i=0; i<=sizeof(Vettore)/sizeof(int)-2; i++)
for (j=0; j<sizeof(Vettore)/sizeof(int)-2; j++)
if((Vettore[j]%2) > (Vettore[j+1]%2))
swap(&Vettore[j], &Vettore[j+1]);

for (y=0; y<sizeof(Vettore)/sizeof(int)-2; y++)
for (i=0; i<sizeof(Vettore)/sizeof(int)-2; i++)
if (Vettore[i+1]%2!=0){
i++;
break;
}
else
if(Vettore[i]>Vettore[i+1])
swap(&Vettore[i], &Vettore[i+1]);

for (z=1; z<=sizeof(Vettore)/sizeof(int)-2; z++)
for (j=i; j<=sizeof(Vettore)/sizeof(int)-2; j++)
if(Vettore[j]<Vettore[j+1])
swap(&Vettore[j], &Vettore[j+1]);

for(i=0; i<=sizeof(Vettore)/sizeof(int)-1; i++)
printf("%d ", Vettore[i]);

return 0;
}


void swap(int * const Ptr1, int * const Ptr2){
int temp;
temp=*Ptr2;
*Ptr2=*Ptr1;
*Ptr1=temp;
}

f@nt@m@n
19-09-2006, 01:31
Originariamente inviato da Dario86ostia
Mi serve un algoritmo in c x questi problemi:

Ricorsivo:

Trovare un algoritmo ricorsivo che controlli se due naturali sono primi tra loro, vale a dire non hanno divisori primi in comune maggiori di 1. Si discuta caso base, caso ricorsivo e terminazione della ricorsione.


Questo è un esercizio per trovare il MCD che ho fatto da poco:


#include <stdio.h>

int gcd (int, int);

int main()
{
int n1, n2;

printf ("Inserisci due numeri interi: ");
scanf ("%d %d", &n1, &n2);

printf ("Il MCD di %d e %d sara' %d\n", n1, n2, gcd (n1, n2));

system ("pause");

return 0;
}
int gcd (int x, int y)
{
if (y == 0){
return x;}
else{
return gcd (y, x % y);}
}

funziona, ma magari lo modifichi leggermente tu, perchè io adesso me ne vado a letto :sonno:
:ciauz:

Dario86ostia
19-09-2006, 12:20
Grazie a tutti!

Loading