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

                      Question d'algorithmique

                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                      • Editeur
                      • Markdown