srlima 0 Denunciar post Postado Novembro 8, 2012 pessoal estou com um pequeno problema na execuçao de um programa em c. O problema pede: contruçao de um programa em C que recebe 2 vetores de 10 elementos inteiros e que calcule e retorne o vetor dos dois primeiros (não se repete os valores iguais). até o momento o que eu tenho é o seguinte: (não estou conseguindo o ver o vetor união corretamente sem repetição) #include <stdio.h> #include <stdlib.h> #include<conio.h> int main () { int vet1[10], vet2[10], i, j, uniao[20]; for (i = 0; i <10; i++) { printf ("digite o vetor 1: "); scanf ("%d/n", &vet1[i]); } for (j=0; j<10; j++){ printf ("digite o vetor 2: "); scanf ("%d/n", &vet2[j]); } //mostrar os números dos vetores for(i = 0; i < 10; i++){ printf("\nvet1: "); printf("%d ",vet1[i]); } for(i = 0; i < 10; i++){ printf("\nvet2: "); printf("%d ",vet2[i]); } //união dos vetores printf("\n\nA uniao e': "); for(j=0;j<20;j++) {if((uniao[0] != vet1[j]) && (uniao[1] != vet1[j]) && (uniao[2] != vet2[j])) printf("%d ", vet1[j]); } for(i=0; i<20; i++) {printf("%d ",uniao[i]); } for(j=0;j<20;j++) {if((uniao[0] != vet2[j]) && (uniao[1] != vet2[j]) && (uniao[2] != vet2[j])) printf("%d ", vet2[j]); } getch(); } Compartilhar este post Link para o post Compartilhar em outros sites
guidjos 65 Denunciar post Postado Novembro 9, 2012 Qual a pergunta? Compartilhar este post Link para o post Compartilhar em outros sites
srlima 0 Denunciar post Postado Novembro 9, 2012 Qual a pergunta? não estava conseguindo o ver o vetor união corretamente sem repetição. mas ja consegui resolver venDo outros tópicos por aqui. agora meu problema é outro. consigo achar o vetor união, mas nao consigo fazer com que o valores repitidos apareçam apenas uma vez. #include <stdio.h>#include <stdlib.h> #include<conio.h> int main (){ int vet1[10], vet2[10], i, j,l, uniao[20]; for (i = 0; i <10; i++){ printf ("digite o [%d] vetor 1: ", i); scanf ("%d/n", &vet1); } for (j=0; j<10; j++){ printf ("digite o [%d] vetor 2: ", j); scanf ("%d/n", &vet2[j]); } for(i = 0; i < 10; i++){ printf("\nvet1: "); printf("%d ",vet1); } for(i = 0; i < 10; i++){ printf("\nvet2: "); printf("%d ",vet2); } printf("\n\nA uniao e': "); for(j=0;j<10;j++) {if((uniao[0] != vet1[j]) && (uniao[1] != vet1[j]) && (uniao[2] != vet2[j])) printf("%d ", vet1[j]); } for(i=0; i<l; i++) //1 ou 20 {printf("%d ",uniao); } for(j=0;j<10;j++) {if((uniao[0] != vet2[j]) && (uniao[1] != vet2[j]) && (uniao[2] != vet2[j])) printf("%d ", vet2[j]); } getch(); } DUVIDA: COMO FAZER OS VALORES REPETIDOS APARECEREM APENAS UMA VEZ? Compartilhar este post Link para o post Compartilhar em outros sites
_Isis_ 202 Denunciar post Postado Novembro 9, 2012 #include <stdio.h> #include <string.h> int has_element(int * array, int array_limit, int element) { for(int i=0; i < array_limit; i++) { if (array[i] == element) return i; } return -1; } void build_union_array(int * array, int array_limit, int element) { // Verificar se o array já possui o elemento. if (has_element(array, array_limit, element) == -1) { // Encontrar a última posição vazia. int i=0; while (i < array_limit && array[i] != -1) i++; if (i < array_limit) target[i] = element; } } int main(void) { int v1[10] = {1,4,7,2,56,98,34,721,87,17}; int v2[10] = {4,67,284,82,47,9,72,2,58,4}; int v3[20]; memset(v3, -1, 20 * sizeof(int)); // Isso serve p/ preencher toda a área de memória que v3 ocupa com o valor '-1' sem usar for. int i; for(i=0; i < 10; i++) { build_union_array(v3, 20, v1[i]); build_union_array(v3, 20, v2[i]); } // Impressão for(i=0;i < 20; i++) { if (v3[i] != -1) printf("%d ", v3[i]); } return 0; } Óbvio que tem a desvantagem de você não poder usar '-1' como dado p/ inserir no array. Compartilhar este post Link para o post Compartilhar em outros sites
GBecker 51 Denunciar post Postado Novembro 9, 2012 Terá de testar se cada novo valor que você quer mostrar não é igual aos elementos anteriores do vetor, ou seja, terá de comparar a posição atual com todas as posições anteriores do vetor. Compartilhar este post Link para o post Compartilhar em outros sites
guidjos 65 Denunciar post Postado Novembro 10, 2012 Aqui vou assumir que todos os n elementos de entrada são distintos (pior caso). A forma simples de resolver é O(n^2), sendo a busca por um elemento (equivalente ao `has_element` da Isis) linear. Basicamente, o problema a ser resolvido é o de construir um conjunto a partir de uma lista de valores potencialmente repetitivos, e depois construir um vetor com todos os elementos do conjunto. Isto pode ser feito em O(n). Se você usar, para a criação do conjunto, estruturas de dados como heaps, árvores AVL, Red-Black ou B, a complexidade de tempo da construção é O(nlog n), que fica sendo a complexidade geral da solução. Admitindo que pro seu conjunto de entrada exista uma função de hashing perfeita (injetora), a complexidade de tempo da criação do conjunto é O(n). A criação do vetor resultante também pode ser feita em O(n), que é, para este caso, a complexidade de tempo da solução. Compartilhar este post Link para o post Compartilhar em outros sites