Tous les concours d'algorithmique et de programmation

Euh les gens chez moi quand je tape « -15 % 4 », ça me répond -3 ... Je vous signale que % ça donne quand même le reste de la division euclidienne du truc de gauche par le truc de droite ... (après reste à savoir de quel reste il s'agit).

Donc je reprends :
A = mod(-15, 4)
A = ((-15 % 4) + 4) % 4
A = (-3 + 4) % 4
A = 1 % 4
A = 1

C'est ce que j'ai dit « ([…] -15 % 4 = -15), ce n'est pas valide que je sache. ».
Ta première version TLN « mod(x,n) { return ((x % n) + n) % n; } » me semble plus efficace (3 opérations), ta seconde version « mod(x,n) { return x

Quel est le problème avec la deuxième version de TLN ?
En terme de temps en tout cas je penche pour celle-là : deux ou trois opérations et un seul modulo (qui est je pense une opération coûteuse).

epsilon012, je ne vois pas le problème avec ma deuxième version. De plus si l'opération modulo est considérée comme « coûteuse », ne vaut-il pas mieux faire un if ? En plus dans un monde idéal où les compilateurs sont intelligents, ils peuvent résoudre certains if au moment de la compilation, s'ils savent que x est toujours positif ou quoi ...

Enfin on s'en crisse pas mal au final du temps de calcul engendré par le mod, car de toutes façons ça sera négligeable par rapport au reste du programme xD

Commence pas à me crisser, de toutes façons tes int sont ≤ 2\^32, donc toutes les opérations se font en O(1) :p

Nah ! J'ai des unsigned long long à 64 bits moua, môssieur !
Et un autre avantage de cout sur printf, d'ailleurs. printf("%d", ULLONG_MAX); renvoie -1, alors que std::cout

Preuve que printf est tordu : il implique d'apprendre toute une table de symboles (%d, etc.) pour l'utiliser !
(Bon, c'est un changement d'argument finalement, mais osef. \^\^)

@epsilon012: Pas avec le simple g++ tmp.cpp. Mais, maintenant que tu le dis, je viens de tester et avec -Wall ça le fait.

Répondre au sujet

Vous devez vous enregistrer ou vous connecter pour poster des messages.