web-dev-qa-db-fra.com

Conversion d'une chaîne en entier sans utiliser la multiplication C #

Existe-t-il un moyen de convertir une chaîne en nombres entiers sans utiliser la multiplication. L'implémentation de int.Parse () utilise également la multiplication. J'ai d'autres questions similaires où vous pouvez convertir manuellement la chaîne en int, mais cela nécessite également de multiplier le nombre par sa base 10. C'était une question d'entrevue que j'avais dans l'une des interviews et je n'arrive pas à trouver de réponse à ce sujet.

9
chaudrhy

Toute multiplication peut être remplacée par une addition répétée. Vous pouvez donc remplacer n'importe quelle multiplication dans un algorithme existant par une version qui n'utilise que l'addition:

static int Multiply(int a, int b)
{
    bool isNegative = a > 0 ^ b > 0;
    int aPositive = Math.Abs(a);
    int bPositive = Math.Abs(b);
    int result = 0;
    for(int i = 0; i < aPositive; ++i)
    {
        result += bPositive;
    }
    if (isNegative) {
        result = -result;
    }
    return result;
}

Vous pouvez aller plus loin et écrire une chaîne spécialisée dans Int en utilisant cette idée qui minimise le nombre d'ajouts (nombre négatif et gestion des erreurs omis par souci de concision):

static int StringToInt(string v)
{
    const int BASE = 10;
    int result = 0;
    int currentBase = 1;
    for (int digitIndex = v.Length - 1; digitIndex >= 0; --digitIndex)
    {
        int digitValue = (int)Char.GetNumericValue(v[digitIndex]);
        int accum = 0;
        for (int i = 0; i < BASE; ++i)
        {
            if (i == digitValue)
            {
                result += accum;
            }
            accum += currentBase;
        }
        currentBase = accum;
    }
    return result;
}

Mais je ne pense pas que cela vaille la peine, car les performances ne semblent pas être un problème ici.

0
David Brown