3 votes

Multiplication simple

Allons droit au but. J'ai créé le code suivant pour multiplier deux nombres et il "mange" mes zéros ! Il semble fonctionner correctement dans les cas où le produit (p) n'est pas égal à zéro. Dans le cas de l'exemple, il imprime simplement "5" au lieu de "500". Je serais vraiment reconnaissant si quelqu'un pouvait m'expliquer ce qui se passe :)

using System;
class Program
{
   static void Main()
   {
      Console.WriteLine(smallNumBigNumProduct("5", "100"));
   }

   static string smallNumBigNumProduct(string s, string b)
   {
      int l = s.Length;
      int f = int.Parse(s); // factor
      int c = 0; // carry
      string r = ""; // result
      int p; // product

      while(l-- > 0)
       {
          p = (Convert.ToInt32(b[l]) - 48) * f;
          p += c;

          if (p > 9)
          {
            r = Convert.ToString(p % 10) + r;
            c = p / 10;
          }

          else
            r = Convert.ToString(p) + r;
       }

       if (c > 0)
       {
         r = Convert.ToString(c) + r;
       }

   return r;
   }
}

5voto

Oded Points 271275

Voici votre problème :

int l = s.Length;

...

while(l-- > 0)

Vous définissez votre l à la longueur de la variable court puis dans votre while vous le prédécrémentez.

En bref, votre boucle n'est pas exécutée le nombre de fois que vous pensez qu'elle l'est. La fonction l est fixée à la longueur de la variable b chaîne ?

Quoi qu'il en soit, cela semble être une méthode longue et sujette à erreurs. Pourquoi ne pas simplement convertir les chaînes d'entrée en entiers et retourner le produit directement ?

4voto

Mitch Wheat Points 169614

Que diriez-vous de.. :

    public static string smallNumBigNumProduct(string a, string b)
    {
          // NOTE no error checking for bad input or possible overflow...

        int num1 = Convert.ToInt32(a);
        int num2 = Convert.ToInt32(b);

        return ((num1*num2).ToString());
    }

Ou mieux encore si vous utilisez .NET 4.0 (mis à jour grâce à l'incitation de Gabe) :

public static string smallNumBigNumProduct(string a, string b)
{
    // NOTE no error checking for bad input or possible overflow...

    BigInteger num1 = BigInteger.Zero;
    BigInteger num2 = BigInteger.Zero;

    bool convert1 = BigInteger.TryParse(a, out num1);
    bool convert2 = BigInteger.TryParse(b, out num2);

    return (convert1 && convert2) ? (num1*num2).ToString() : "Unable to convert";
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X