2011-04-17 4 views
3

Allons droit au but. J'ai fait le code suivant pour multiplier deux nombres et c'est "manger" mes zéros! Cela semble bien fonctionner pour les cas qui n'impliquent pas d'avoir un produit (p) égal à zéro. Dans l'exemple, il imprime simplement "5" au lieu du "500" désiré. Je serais vraiment reconnaissant si quelqu'un voulait expliquer ce qui se passait. :)Multiplication simple

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; 
    } 
} 
+0

Je ne comprends pas ce que vous voulez dire. : p – Codetester

+0

Oups ... Je viens de voir mon erreur. – Codetester

+3

Les noms de variable à une lettre vous blessent * et * moi. – arcain

Répondre

5

Voici votre problème:

int l = s.Length; 

... 

while(l-- > 0) 

Vous définissez votre l variable à la longueur de la courte chaîne, puis dans votre boucle while vous pré-décrémentez-le.

En résumé, votre boucle n'est pas exécutée autant de fois que vous le pensez. La variable l ne doit-elle pas être définie sur la longueur de la chaîne b? Quoiqu'il en soit, cela ressemble à une façon longue et sujette à erreur pour ce faire. Pourquoi ne pas simplement convertir les chaînes d'entrée en entiers et retourner le produit directement?

+0

J'ai déjà corrigé cette erreur! Je voulais utiliser b, pas l. Un léger oubli! Merci! La raison pour laquelle je le fais de cette façon est de pouvoir multiplier un petit nombre par un qui a des dizaines de chiffres. – Codetester

+2

Ainsi, le [BigInteger] (http://msdn.microsoft.com/en-us/library/system.numerics.biginteger.aspx) introduit dans .NET 4.0 ne peut pas fonctionner pour vous? – Oded

+0

J'utilise ceci pour un problème de SPOJ, je ne sais pas si je peux utiliser BigInteger là-bas. – Codetester

4

Que diriez-vous:

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 encore mieux si vous utilisez .NET 4.0 (mise à jour grâce à de Gabe invite):

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"; 
} 
+0

Pensez-vous vraiment qu'une fonction avec "BigNum" dans son nom peut être implémentée avec simplement "Convert.ToInt32"? Je veux dire, vous voudriez au moins utiliser 'long' ou' decimal'. Ne pas mentionner lequel, même la solution 'BigInteger' est cassée parce qu'elle se convertit en' Int64' avant de faire la multiplication. – Gabe

+0

@Gabe: Bon point. –