Jump to content
LegendKiller

A 2 problema c++

Recommended Posts

apropo, in general precizeaza la probleme cam la ce materie ai ajuns? Sunt 3 metode citirea si pentru memorarea datelor:

1) iti cere alocare dinamica - pointeri (inclusiv liste, stive, cozi etc)?

2) cunosti numarul de elemente al multimilor, M si N (nu le citesti de la tastatura) si folosesti tablouri array mul1[M] mul2[N]?

3) declari 2 tablouri de un numar maxim de elemente, sa zic mul1[10000], mul2[10000] si citesti de la tastatura dimensiunea multimii M<10000 si N<10000?

O rezolvare (3) Folosesc o functie de validare a multimilor care elimina elementele care se repeta.

Modificat cu optimizari:

Am scos validarile de pe rezultat. Erau necesare la reuniunea M1 U M2 dar am folosit o formula mai utila, M1 U M2 = M1 U (M2-M1). (elementele din M1 + elementele care sunt in M2 si nu in M1)

Prima data calculam in 2 bucle intersectia M1^M2, diferenta M1-M2 si copiem M1 in vectorul reuniunii.

Apoi calculam diferenta M2-M1 si in paralel in aceeasi bucla reuniunea dupa formula M1 U M2 = M1 U (M2-M1).

Daca presupui ca multimile sunt introduse corect fara ca elementele sa se repete, atunci poti scoate de tot functia validare.


#include <stdio.h>
int mul1[10000];
int mul2[10000];
int reuniune[20000];
int intersectie[10000];
int diferenta12[10000];
int diferenta21[10000];
int n1,n2,nu=0,ni=0,nd12=0,nd21=0;
int i,j;

int validare(int *, int);

int main()
{
// citim datele
printf("n1="); scanf("%d",&n1);
printf("Baga elementele multimii\n");
for(i=0;i<n1;i++)
scanf("%d",&mul1[i]);
printf("Baga elementele celei de a doua multimi\n");
printf("n2="); scanf("%d",&n2);
for(i=0;i<n2;i++)
scanf("%d",&mul2[i]);

// eliminam ce se repeta
n1=validare(mul1,n1);
n2=validare(mul2,n2);

// punem in reuniune prima multime
// calculam intersectia: elementele comune
// calculam diferenta 1-2: elementele din 1 care nu sunt in 2
for(i=0;i<n1;i++)
{ int gasit=0;
reuniune[nu]=mul1[i];
nu++;
for(j=0;(j<n2)&&(!gasit);j++)
if(mul1[i]==mul2[j])
{ intersectie[ni]=mul1[i];
ni++;
gasit=1;
}
if(!gasit)
{ diferenta12[nd12]=mul1[i];
nd12++;
}
}

// calculam diferenta 2-1: elementele din 2 care nu sunt in 1
// completam reuniunea cu diferenta 2-1
for(j=0;j<n2;j++)
{ int gasit=0;
for(i=0;(i<n1)&&(!gasit);i++)
if(mul1[i]==mul2[j])
gasit=1;
if(!gasit)
{ reuniune[nu]=diferenta21[nd21]=mul2[j];
nd21++;
nu++;
}
}

//afisam
printf("\nReuniune: ");
for(i=0;i<nu;i++) printf("%d ",reuniune[i]);
printf("\nIntersectie: ");
if(ni)
for(i=0;i<ni;i++) printf("%d ",intersectie[i]);
else printf("M. Vida");
printf("\nDiferenta Mul1-Mul2: ");
if(nd12)
for(i=0;i<nd12;i++) printf("%d ",diferenta12[i]);
else printf("M. Vida");
printf("\nDiferenta Mul2-Mul1: ");
if(nd21)
for(i=0;i<nd21;i++) printf("%d ",diferenta21[i]);
else printf("M. Vida");

return 0;
}

int validare(int *multime, int n)
{
for(int i=0;i<n;i++)
for(int j=i+1;j<n;j++)
if(multime[i]==multime[j])
{ n--;
multime[j]=multime[n];
}
return n;
}

Edited by loki
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



×
×
  • Create New...