From cbc0cf780ea0d49675f8d4dfbd4148bddddd0ba6 Mon Sep 17 00:00:00 2001 From: Karl_FRAM Date: Wed, 21 Oct 2026 12:20:55 +0200 Subject: [PATCH] EXO 4 - optimisation F7 --- banque | Bin 21576 -> 21656 bytes banque.c | 38 +++++++++++++++++++++++++++++++++++--- 2 files changed, 35 insertions(+), 3 deletions(-) diff --git a/banque b/banque index b24d472e3f626018fdf3457b3ef4d731260e6d89..55060bc0c76443d920748edf6db1857c655a368d 100755 GIT binary patch delta 4464 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 FIsh-fx*`Ao diff --git a/banque.c b/banque.c index acc2d13..42dc709 100644 --- a/banque.c +++ b/banque.c @@ -162,13 +162,45 @@ const Transaction *rechercher_par_id(const Transaction *t, int n, int id) } /* F7 : nombre de paires de transactions de montants opposés (a + b = 0) */ + + +static int cmp_long(const void *a, const void *b) +{ + long x = *(const long *)a; + long y = *(const long *)b; + return (x > y) - (x < y); +} + long nb_paires_opposees(const Transaction *t, int n) { + /* 1. Copier et trier les montants : O(n log n) */ + long *m = malloc(n * sizeof(long)); + for (int i = 0; i < n; i++) { + m[i] = t[i].montant; + } + qsort(m, n, sizeof(long), cmp_long); + + /* 2. Deux pointeurs : O(n) au lieu de O(n²) */ long nb = 0; - for (int i = 0; i < n; i++) - for (int j = i + 1; j < n; j++) - if (t[i].montant + t[j].montant == 0) + int g = 0, d = n - 1; + + while (g < d) { + long somme = m[g] + m[d]; + + if (somme < 0) { + g++; + } else if (somme > 0) { + d--; + } else { + /* somme == 0 : on compte tous les m[d] identiques en face de m[g] */ + for (int k = d; k > g && m[k] == m[d]; k--) { nb++; + } + g++; /* Puis on passe simplement au m[g] suivant ! */ + } + } + + free(m); return nb; }