Lo siguiente debería generar 2 números aleatorios entre 0 y 100, que siguen ciertas reglas.

Esas reglas son:

* Ninguno puede ser 0

* Num1 debe ser mayor que Num2

* Y Num1 debe ser divisible por Num2 (El bit num1% num2)

Actualmente, el bucle funciona correctamente para los dos primeros puntos, pero no para el último. Todavía está generando números donde num1 no es divisible por num2. ¿Qué salió mal?

do {
        if (num1 == 0) {
            num1 = rand()%100;
        }
        else if(num2 == 0) {
            num2 = rand()%100;
        }
        else if (num1 < num2) {
            num2 = rand()%100;
        }
        else if(num1 % num2 != 0) {
            num2 = rand()%100;
        }
        a++;
        printf("Loop no.:%d %d mod %d = %d %d / %d \n",a,num1,num2,num1%num2,num1,num2);
    } while(num1 < num2 && (num1%num2 != 0) && num1 != 0 && num2 != 0);
c
0
user8940323 14 nov. 2017 a las 23:32

2 respuestas

La mejor respuesta

Si desea que se cumplan todas las condiciones, su condición while debería ser algo como while(num1 < num2 || (num1%num2 != 0) || num1== 0 || num2 == 0). Si conecta las condiciones con &&, el ciclo terminará una vez que no se cumpla una de las condiciones, p. Ej. cuando num1 no es divisible por num2.

1
Stephan Lechner 14 nov. 2017 a las 20:38

Esto se puede hacer de manera más eficiente.

Comience con un número,

num2 = rand()%50 + 1;

Este será el número más bajo. Si es mayor que 50, no hay un segundo número posible.
Luego, calcule cuántos números son posibles para num1. Dado que num1 debe ser un múltiplo de num2, y menor o igual que 100, y puede que no sea lo mismo que num2:

int nnum1 = 100/num2 - 1;

El, solo elige una:

num1 = (rand()%nnum1 + 2)*num2;

Demostración en vivo aquí

2
alain 14 nov. 2017 a las 21:18