Adloun

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 long pour 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 des long, 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

Exercice suivant et tuteur

Sans compte : le cours et le premier QCM. Exercices et tuteur : inscription gratuite en 30 secondes, sans carte bancaire.

Le cours du chapitre · Tous les exercices du chapitre

Exercice suivant et tuteur →