No puedo encontrar la lógica correcta para encontrar la cantidad de elementos repetidos en una matriz. Puedo entender por qué mi lógica no funciona, pero no soy capaz de superarlo.
La siguiente es la pregunta real:
Escriba un programa que declare un arreglo entero
arrde tamañon. Primero toma un entero positivondel usuario. Luego leennúmeros y los almacena enarr. Comprueba e imprime el número de repeticiones enarr. El resultado es la suma del número total de repeticiones en la matriz.
Ejemplo: Siarr=[4,3,4,4,3,4,5]
Entonces el número de repeticiones es6(que son 4 repeticiones de4+ 2 repeticiones de3)
El siguiente es mi código:
#include <stdio.h> int main() { int n, i, j, count = 1, p = 0; printf("Enter the length of array"); scanf("%d", &n); int arr[n]; for (i = 0; i < n; i++) { printf("Enter a number\n"); scanf("%d", &arr[i]); } for (i = 0; i < n; i++) { for (j = i + 1; j < n; j++) { if (arr[i] == arr[j]) { count++; break; } } if (count != 1) { p = p + count; count = 1; } } printf("Number of repetitions are %d", p); } Para el código anterior, si tomamos la matriz como se menciona en la pregunta, cada vez que mi código encuentra dos 4 iguales, los cuenta a ambos, por lo tanto, mi programa termina contando un número extra de 4. Así que no puedo encontrar una mejor lógica para superarlo.
( Soy un principiante, así que no tengo muchas funciones/métodos avanzados utilizados en C )
Una de las cosas que puede hacer es mantener una matriz adicional para los números que ha verificado y cada vez que compare números, verificará si ya ha visto este número o no.
También quiero incluir algunos otros enfoques para este problema. Si sabemos que los números en la lista no serán tan grandes, podemos usar una matriz para realizar un seguimiento de los recuentos.
//numbers = {4, 3, 4, 4, 3, 4, 5} int max = findMaxValue(numbers); int counts[max]; //should be done with dynamic memory allocation for(i=0;i<max;i++){ counts[max] = 0; } for(i=0;i<numbers.size;i++){ counts[numbers[i]]++; } int sum = 0; for(i=0;i<max;i++){ if(counts[i] > 1){ sum += counts[i]; } }Otra cosa que puede hacer es ordenar los números primero y luego comparar los elementos adyacentes.
Creo que es una idea juntar los mismos elementos primero clasificándolos.
#include<stdio.h> int main() { int n = 0, count = 0; printf("Enter the length of array: "); scanf("%d", &n); int arr[n]; for (int i = 0; i < n; i++) { printf("Enter a number: "); scanf("%d", &arr[i]); } //sort for (int j = 0; j < n - 1; j++) { for (int k = j + 1; k < n; k++) { if (arr[j] >= arr[k]) { arr[j] = arr[j] ^ arr[k]; arr[k] = arr[j] ^ arr[k]; arr[j] = arr[j] ^ arr[k]; } } } // count int num = 1; // If you don't want to include the repeated number itself, replace all "num = 1" with "num = 0" for (int j = 0; j < n - 1; j++) { if (arr[j] == arr[j + 1]) num++; else { printf("The num %d repeats %d times\n", arr[j], num); // You can delete this line count += num; num = 1; //Initialize num to avoid repeated accumulation of num and prepare to enter the next loop } } printf("Total repeats: %d\n", count); return 0; }Para evitar contar en exceso, deberá realizar un seguimiento de los números que ya se han repetido. Solo tendría una segunda matriz para guardar valores "ya repetidos":
#include <stdio.h> int main() { int n, p = 0, r = 0; printf("Enter the size of the array: "); scanf(" %u",&n); int arr[n]; int rep[n - 1]; for (int i = 0; i < n; i++) { printf("Enter arr[%d]: ",i); scanf(" %d",&arr[i]); } for (int i = 0; i < n; i++) { int count = 1, j; for (j = 0; j < r; j++) { if (arr[i] == rep[j]) break; } if (j < r) continue; for (j = i + 1; j < n; j++) if (arr[i] == arr[j]) count++; if (count > 1) { p = p + count; rep[r++] = arr[i]; } } printf("Number of repitions is %d\n",p); }