Hola,
estaba haciendo un simple programa en C++ porque me aburría y, al probarlo, el programa llegaba a cierto punto y se cerraba.
Lo que intento es llenar un array con números [-2000, 2000], guardar los números usados en un bitset (bs[1024] sería 1 si he metido 1024 en el array y 0 si no lo he hecho) y luego, con un for, empezar en -2000 y llegar a 2000 mostrando todos los números que no he usado en el array anterior, y para evitar recorrer el array cada iteración, usé un bitset que consume menos memoria y es más rápido.
El código es este:
#include <iostream> // std::
#include <stdlib.h> // rand(), srand()
#include <time.h> // time()
#include <bitset> // bitset<>
using namespace std;
int main(){
int a[4000], t;
bitset<2000> used1;
bitset<2000> used2;
srand((unsigned) time(NULL));
for(int i=0;i<4000;i++){
t = rand() % 2000;
a[i] = (rand() % 2 ? t : -t);
if(a[i] >= 0) used1[a[i]] = 1;
else used2[a[i] * (-1)] = 1;
}
cout << "Not used:\n";
for(int i=-2000;i<2000;i++){
if((i >= 0 && !used1[i]) || used2[i * (-1)]) cout << i << " ";
}
cin.get();
return 0;
}
Gracias y saludos
El problema que mencionas se debe a la sentencia condicional:
for (int i = -2000; i < 2000; i++){
if ((i >= 0 && !used1[i]) || used2[i * (-1)])
cout << i << " ";
}
Al evaluarse el operando izquierdo de "||":
(i >= 0 && !used1[i])
Si "i" es mayor o igual a cero y "!used1[ i ]" es cero la condición es falsa y se evalúa la expresión a su derecha:
used2[i * (-1)]
Y de nuevo: si el valor de "i" es mayor que cero la expresión "i * (-1)" resulta en un indice negativo. Por cierto no hay necesidad de multiplicar por menos uno, puedes utilizar el operador unario "-".
Para que el programa funcione correctamente hay que cambiar el condicional a:
for (int i = -2000; i < 2000; i++){
if ((i >= 0 && !used1[i]) || (i < 0 && !used2[-i]))
cout << i << " ";
}
También debes declarar el bitset "used2" con una capacidad de 2001 elementos (ello porque su elemento con indice cero no es utilizado).
Un saludo
Muchas gracias, ya lo he solucionado, sabía que los índices negativos no existen, pero mira lo que hacen las prisas ;-) se puede cerrar