algorithmique (école d'ingénieur) · Chapitre 11 · Application directe du cours
Racine carrée entière
Programmes justes : logique de Hoare et invariants · niveau 2
Énoncé
On veut pour un entier , c'est-à-dire l'unique entier tel que .
- Écrire une fonction en sur l'invariant .
- Écrire une fonction en sur l'invariant , en faisant décroître par dichotomie (chapitre 12).
- Pourquoi faut-il calculer avec des
longpour proche de ?
Corrigé
- Initialisation (). Progression : , on incrémente . Arrêt : , donc . La boucle fait tours : .
static int racineLineaire(int n) { // n ≥ 0
int r = 0; // r² ≤ n
while ((r + 1) * (r + 1) <= n) // r² ≤ n et (r+1)² ≤ n
r = r + 1; // r² ≤ n
return r; // r² ≤ n < (r+1)²
}
- Initialisation : , (). Arrêt : , alors . Progression, avec qui vérifie tant que : et . Le variant est au moins divisé par deux à chaque tour : .
static int racineDicho(int n) { // n ≥ 0
long g = 0, d = (long) n + 1; // I(g,d) : g² ≤ n < d²
while (d - g != 1) { // I(g,d) et d - g ≥ 2
long m = (g + d) / 2; // g < m < d
if (m * m <= n) g = m; // I(m,d)
else d = m; // I(g,m)
} // g² ≤ n < (g+1)²
return (int) g;
}
- Pour , dépasse déjà la capacité d'un
int, et peut atteindre . Avec deslong,racineDicho(2147483647)retourne bien ; la version linéaire, elle, déborde sur(r + 1) * (r + 1)pour ce .
100 % gratuit
La suite du chapitre est sur Adloun
- 12 autres exercices corrigés dans ce chapitre
- Les 2 QCM du chapitre, le premier sans compte
- Le tuteur, qui guide pas à pas sans donner la réponse
Sans compte : le cours et le premier QCM. Exercices et tuteur : inscription gratuite en 30 secondes, sans carte bancaire.