NameNick321 ho pensato a come fare l'ottimizzazione che dicevo, se interessa ecco il codice completo: procede per step in modo analogo alla bisezione, parte da tutto l'intervallo (quindi 1 e 50 estremi compresi) chiedendo la via di mezzo (sempre arrotondato all'intero) quindi 25; se è maggiore o minore di 25 cambia il rispettivo limite inferiore o superiore, vale a dire che se è minore di 25 cerco fra 1 e 25 eliminando la zona 26-50 e viceversa; quindi prende sempre il valore in mezzo e ripete la procedura, fino che si arriva a convergenza. L'ho provato e scritto così funziona.
#include <stdio.h>
#include <stdlib.h>
int main() {
int max=50;
int min=1;
int temp;
int numero = (int) (0.5*(max+min)); // inizializzazione
int risposta; // Risposta dell'utente si/no
int minmag = 1; // 0-1
do {
numero = (int) (0.5*(max+min));
// Chiede all'utente se il numero pensato è 'numero'
printf("Il numero pensato è %d? (0 per no, 1 per sì): ", numero);
scanf("%d", &risposta);
// Se la risposta è sbagliata
if (risposta == 0){
// Chiede all'utente se il numero pensato è maggiore o minore di 'numero'
printf("Il numero pensato è maggiore o minore di %d? (0 per minore, 1 per maggiore): ",numero);
scanf("%d", &minmag);
}
// Se la risposta è corretta
if (risposta == 1) {
// Termina il ciclo
break;
}
// Aggiorno il numero pensato
if (minmag == 1) {
min=(int)(0.5*(min+numero));
} else {
max=(int)(0.5*(max+numero));
}
} while (1);
if (risposta == 1) {
printf("Hai indovinato! Il numero pensato era %d.\n", numero);
} else {
printf("Hai perso! Il numero pensato era %d.\n", numero);
}
return 0;
}