Partage
  • Partager sur Facebook
  • Partager sur Twitter

Question d'algorithmique

Sujet résolu
1 décembre 2014 à 16:25:01

Hello !

Je crée actuellement un petit applicatif, de calcul de volume de rétention, à destination d'entrepôts de calcul.

Je butte sur une condition: lors du calcul de volume, il est nécessaire d'arrondir le volume au multiple de 30 supérieur.

Exemple : le volume calculé est égal à 217, ce résultat doit donc être arrondit à 240. Pour  849, l'arrondi serait 870.

Comment formaliser cette condition à part dans une imbuvable addition de condition ?

Pour mon sauveur (ou ma sauveuse), il est possible de me répondre en pseudo code, ou en java !

Merci de votre aide

  • Partager sur Facebook
  • Partager sur Twitter
1 décembre 2014 à 17:44:32

Ce que tu cherches, c'est le multiple de 30 au-dessus de ton nombre N. Par division euclidienne, tu sais que N = 30*Q + R, avec R < 30. Par conséquent, 30*(Q + 1) > N, et sera bien un multiple de 30. Comment trouver Q ? Il suffit de faire une division entière.

public static int arrondi(int n) {
    return ((n / 30) + 1) * 30;
}

-
Edité par Urasyphon 1 décembre 2014 à 17:44:51

  • Partager sur Facebook
  • Partager sur Twitter
Brotip : n'oubliez jamais le NULL à la fin de vos chaînes : buffer[strlen(buffer)] = 0x00;
2 décembre 2014 à 8:56:13

Merci Urasyphon pour ta réponse. Cependant si j'applique ((n/30) + 1) * 30 à 217 par exemple, ça me donne

217/30, environ 7,23

+1 environ 8,23

* 30 donne 247, cela a juste rajouté 30 à l'entier de départ, ce qui est logique puisque on applique un +1 à la division de départ. N'appréhendant pas pleinement la division euclidienne, je n'arrive pas à déterminer ce qu'il manque dans le calcul !

Help !

Merci :D


Urasyphon a écrit:

Ce que tu cherches, c'est le multiple de 30 au-dessus de ton nombre N. Par division euclidienne, tu sais que N = 30*Q + R, avec R < 30. Par conséquent, 30*(Q + 1) > N, et sera bien un multiple de 30. Comment trouver Q ? Il suffit de faire une division entière.

public static int arrondi(int n) { return ((n / 30) + 1) * 30; } 

-
Edité par Urasyphon il y a environ 15 heures



  • Partager sur Facebook
  • Partager sur Twitter
2 décembre 2014 à 9:44:11

Haurdun a écrit:

Merci Urasyphon pour ta réponse. Cependant si j'applique ((n/30) + 1) * 30 à 217 par exemple, ça me donne

217/30, environ 7,23

+1 environ 8,23

* 30 donne 247, cela a juste rajouté 30 à l'entier de départ, ce qui est logique puisque on applique un +1 à la division de départ. N'appréhendant pas pleinement la division euclidienne, je n'arrive pas à déterminer ce qu'il manque dans le calcul !

Help !

Merci :D


Urasyphon a écrit:

Ce que tu cherches, c'est le multiple de 30 au-dessus de ton nombre N. Par division euclidienne, tu sais que N = 30*Q + R, avec R < 30. Par conséquent, 30*(Q + 1) > N, et sera bien un multiple de 30. Comment trouver Q ? Il suffit de faire une division entière.

public static int arrondi(int n) { return ((n / 30) + 1) * 30; } 

-
Edité par Urasyphon il y a environ 15 heures



Salut,

Je ne suis pas d'accord avec ton calcul. Urasyphon précise bien que tout est fait avec des entiers. Donc :

217/30=7

7+1=8

8*30=240

  • Partager sur Facebook
  • Partager sur Twitter
2 décembre 2014 à 10:44:48

J'ai bien parlé de division entière, en effet. Si tu oublies la partie décimale (tu gardes 7 au lieu de 7,23...), tu fais exactement ce que tu veux.

Quel est ton niveau scolaire ?

  • Partager sur Facebook
  • Partager sur Twitter
Brotip : n'oubliez jamais le NULL à la fin de vos chaînes : buffer[strlen(buffer)] = 0x00;
2 décembre 2014 à 10:46:35

Brillant à vous deux, il en faut bien deux pour que je comprenne ^^

Merci !

  • Partager sur Facebook
  • Partager sur Twitter
2 décembre 2014 à 10:46:41

L'idée est là, mais la formule donnée n'est pas tout a fait juste : il me semble que pour 240, il faut renvoyer 240, pas 270. (n + 29) / 30 * 30 devrait fonctionner.

-
Edité par BananeFraise 2 décembre 2014 à 10:47:21

  • Partager sur Facebook
  • Partager sur Twitter
OCaml, un langage expressif et performant qui vous ferait du bien.
2 décembre 2014 à 10:48:37

Faute d'inattention ! J'avais omis la division entière, désolé !

Urasyphon a écrit:

J'ai bien parlé de division entière, en effet. Si tu oublies la partie décimale (tu gardes 7 au lieu de 7,23...), tu fais exactement ce que tu veux.

Quel est ton niveau scolaire ?



  • Partager sur Facebook
  • Partager sur Twitter
2 décembre 2014 à 10:54:12

BananeFraise a écrit:

L'idée est là, mais la formule donnée n'est pas tout a fait juste : il me semble que pour 240, il faut renvoyer 240, pas 270.

Ha, évidemment.

-
Edité par Urasyphon 2 décembre 2014 à 10:54:45

  • Partager sur Facebook
  • Partager sur Twitter
Brotip : n'oubliez jamais le NULL à la fin de vos chaînes : buffer[strlen(buffer)] = 0x00;
2 décembre 2014 à 11:12:12

A 3, vous y êtes arrivés ! Merci à vous trois
  • Partager sur Facebook
  • Partager sur Twitter