89 votes

Comment pouvez-vous obtenir le premier chiffre d'un int (C #)?

En C#, ce qui est la meilleure façon d'obtenir le 1er chiffre dans un int? La méthode que j'ai trouvé est de mettre le int en string, trouvez le 1er caractère de la chaîne, puis remettez-le à un int.

int start = Convert.ToInt32(curr.ToString().Substring(0, 1));

Bien que ce fait le travail, il se sent comme il est probablement une bonne, simple, mathématiques solution à un tel problème. La manipulation de chaînes se sent maladroit.

Edit: indépendamment des différences de vitesse, machaine[0] au lieu de Substring() est toujours juste de la manipulation de la chaîne

232voto

John Rasch Points 28874

Repères

Tout d'abord, vous devez décider de ce que vous entendez par "meilleure" solution, bien sûr, qui tient compte de l'efficacité de l'algorithme, sa lisibilité/maintenabilité, et la probabilité d'insectes rampant dans l'avenir. Attention les tests unitaires peut généralement éviter ces problèmes, cependant.

J'ai couru chacun de ces exemples, 10 millions de fois, et les résultats de la valeur est le nombre d' ElapsedTicks qui ont réussi.

Sans plus tarder, du plus lent au plus rapide, les algorithmes sont:

La conversion d'une chaîne de caractères, prendre la première à caractère

int firstDigit = (int)(Value.ToString()[0]) - 48;

Résultats:

12,552,893 ticks

À l'aide d'un logarithme

int firstDigit = (int)(Value / Math.Pow(10, (int)Math.Floor(Math.Log10(Value))));

Résultats:

9,165,089 ticks

Boucle

while (number >= 10)
    number /= 10;

Résultats:

6,001,570 ticks

Conditions

int firstdigit;
if (Value < 10)
     firstdigit = Value;
else if (Value < 100)
     firstdigit = Value / 10;
else if (Value < 1000)
     firstdigit = Value / 100;
else if (Value < 10000)
     firstdigit = Value / 1000;
else if (Value < 100000)
     firstdigit = Value / 10000;
else if (Value < 1000000)
     firstdigit = Value / 100000;
else if (Value < 10000000)
     firstdigit = Value / 1000000;
else if (Value < 100000000)
     firstdigit = Value / 10000000;
else if (Value < 1000000000)
     firstdigit = Value / 100000000;
else
     firstdigit = Value / 1000000000;

Résultats:

1,421,659 ticks

Déroulé et optimisé boucle

if (i >= 100000000) i /= 100000000;
if (i >= 10000) i /= 10000;
if (i >= 100) i /= 100;
if (i >= 10) i /= 10;

Résultats:

1,399,788 ticks

Note:

chacun des appels de test Random.Next() pour obtenir le prochain int

131voto

Anton Gogolev Points 59794

Voici comment

 int i = Math.Abs(386792);
while(i >= 10)
    i /= 10;
 

et i contiendra ce dont vous avez besoin

31voto

JaredPar Points 333733

Essaye ça

 public int GetFirstDigit(int number) {
  if ( number < 10 ) {
    return number;
  }
  return GetFirstDigit ( (number - (number % 10)) / 10);
}
 

MODIFIER

Plusieurs personnes ont demandé la version en boucle

 public static int GetFirstDigitLoop(int number)
{
    while (number >= 10)
    {
        number = (number - (number % 10)) / 10;
    }
    return number;
}
 

27voto

Lennaert Points 2035

Le mieux que je puisse trouver est:

 int numberOfDigits = Convert.ToInt32(Math.Floor( Math.Log10( value ) ) );

int firstDigit = value / Math.Pow( 10, numberOfDigits );
 

...

Pas très jolie :)

[Edité: la première réponse était vraiment mauvaise :)]

[Edit 2: Je conseillerais probablement les solutions de manipulation de chaîne, cependant]

[Edit 3: le formatage du code est agréable :)]

18voto

Mike Dunlavey Points 25419

variation sur la réponse d'Anton:

  // cut down the number of divisions (assuming i is positive & 32 bits)
if (i >= 100000000) i /= 100000000;
if (i >= 10000) i /= 10000;
if (i >= 100) i /= 100;
if (i >= 10) i /= 10;
 

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