Aller au contenu

Sujet n°26

Sujet original

Pour télécharger l'énoncé original, cliquer ici.

Exercice n°1

Programmer la fonction multiplication, prenant en paramètres deux nombres entiers n1 et n2, et qui renvoie le produit de ces deux nombres.

Les seules opérations autorisées sont l’addition et la soustraction.

Exemples

>>> multiplication(3, 5)
15

>>> multiplication(-4, -8)
32

>>> multiplication(-2, 6)
-12

>>> multiplication(-2, 0)
0
Une solution

Rien n'interdit de définir des fonctions supplémentaires donc on peut définir une fonction renvoyant la valeur absolue d'un nombre.
Puis, une petite boucle devrait suffire...

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
def val_abs(n):
    """
    n - int, entier
    Sortie: int, valeur absolue de l'entier n
    """
    if n < 0:
        n = -n
    return n


def multi(a, b):
    """
    a, b - int, deux entiers
    Sortie: int, produit des nombres a et b
    """
    result = 0
    if a == val_abs(a):
        for i in range(a):
            result = result + b
    else:
        a = val_abs(a)
        for i in range(a):
            result = result - b
    return result


if __name__ == '__main__':
    # Exemples de l'énoncé
    resultat = multi(3, 5)
    print(resultat == 15)

    resultat = multi(-4, -8)
    print(resultat == 32)

    resultat = multi(-2, 6)
    print(resultat == -12)

    resultat = multi(-2, 0)
    print(resultat == 0)

    # Exemples supplémentaires
    resultat = multi(0, 2)
    print(resultat == 0)

    resultat = multi(0, 0)
    print(resultat == 0)

Exercice n°2

Recopier et compléter sous Python la fonction suivante en respectant la spécification. On ne recopiera pas les commentaires.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
def dichotomie(tab, x):
    """
    tab : tableau d’entiers trié dans l’ordre croissant
    x : nombre entier
    La fonction renvoie True si tab contient x et False sinon
    """
    debut = 0
    fin = len(tab) - 1
    while debut <= fin:
        m = ...
        if x == tab[m]:
            return ...
        if x > tab[m]:
            debut = m + 1
        else:
            fin = ...
    return ...
Commentaire sur le code original
  1. Pour télécharger l'original du fichier à compléter, cliquer ici.

  2. Dans cet exercice, il faut reprogrammer un algorithme usuel de recherche par dichotomie dans un tableau trié. Cet algorithme est un indispensable à maîtriser, travaillé depuis la classe de 1ère...

Exemple

>>> dichotomie([15, 16, 18, 19, 23, 24, 28, 29, 31, 33], 28)
True

>>> dichotomie([15, 16, 18, 19, 23, 24, 28, 29, 31, 33], 27)
False
Une solution
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
def dichotomie(tab, x):
    """
    tab : tableau d’entiers trié dans l’ordre croissant
    x : nombre entier
    La fonction renvoie True si tab contient x et False sinon
    """
    debut = 0
    fin = len(tab) - 1
    while debut <= fin:
        m = (debut+fin)//2
        if x == tab[m]:
            return True
        if x > tab[m]:
            debut = m + 1
        else:
            fin = m-1
    return False



if __name__ == '__main__':
    # Exemples de l'énoncé
    print(dichotomie([15, 16, 18, 19, 23, 24, 28, 29, 31, 33], 28) == True)
    print(dichotomie([15, 16, 18, 19, 23, 24, 28, 29, 31, 33], 27) == False)

    # Exemples supplémentaires
    print(dichotomie([15, 16, 18, 19, 23, 24, 28, 29, 31, 33], 15) == True)
    print(dichotomie([15, 16, 18, 19, 23, 24, 28, 29, 31, 33], 33) == True)
    print(dichotomie([15, 16, 18, 19, 23, 24, 28, 29, 31, 33], 14) == False)
    print(dichotomie([15, 16, 18, 19, 23, 24, 28, 29, 31, 33], 34) == False)
    print(dichotomie([], 34) == False)