¿Cómo se puede obtener el primer dígito en un int (C #)?

82

En C #, ¿cuál es la mejor manera de obtener el primer dígito en un int? El método que se me ocurrió es convertir el int en una cadena, encontrar el primer carácter de la cadena y luego volver a convertirlo en un int.

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

Si bien esto funciona, parece que probablemente haya una solución buena, simple y basada en matemáticas para tal problema. La manipulación de cuerdas se siente torpe.

Editar: independientemente de las diferencias de velocidad, mystring [0] en lugar de Substring () sigue siendo solo manipulación de cadenas

Dinah
fuente
Eso es incluso más lento que el método recursivo. =)
J. Steen
mi mal, olvidé restablecer el cronómetro =), es realmente más lento que otros
Quan Mai
2
Esto fallará en números negativos.
zócalo
2
el primer dígito de un int es siempre 1 con supresión de cero (01010101010100101011011011100101) LOL
Zachary Scott

Respuestas:

126

Así es cómo

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

y icontendrá lo que necesitas

Anton Gogolev
fuente
222

Benchmarks

En primer lugar, debe decidir qué quiere decir con "mejor" solución, por supuesto que tenga en cuenta la eficiencia del algoritmo, su legibilidad / mantenibilidad y la probabilidad de que aparezcan errores en el futuro. Sin embargo, las pruebas unitarias cuidadosas generalmente pueden evitar esos problemas.

Ejecuté cada uno de estos ejemplos 10 millones de veces y el valor de los resultados es el número de los ElapsedTicksque han pasado.

Sin más preámbulos, del más lento al más rápido, los algoritmos son:

Convirtiendo a una cadena, tome el primer carácter

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

Resultados:

12,552,893 ticks

Usando un logaritmo

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

Resultados:

9,165,089 ticks

Bucle

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

Resultados:

6,001,570 ticks

Condicionales

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;

Resultados:

1,421,659 ticks

Bucle desenrollado y optimizado

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

Resultados:

1,399,788 ticks

Nota:

cada prueba llama Random.Next()para obtener la siguienteint

John Rasch
fuente
18
Esto es tan trivial. Aprecio lo que ha hecho y es bastante informativo, pero es excesivo para el 99% de las aplicaciones. Me temo que algunos programadores novatos puedan tener una mala impresión. (Optimizaciones prematuras y estrictas sobre legibilidad) Sin embargo, sigue siendo divertido. :)
Samantha Branham
7
¿Dónde está la tabla de búsqueda?
GvS
2
+1 para los puntos de referencia, pero estoy de acuerdo en que es una exageración total. Si está TAN preocupado por el rendimiento, entonces probablemente no debería usar C # en primer lugar :)
GrahamS
15
+1 - Cosas geniales. Este es el tipo de exageración del modelo de lujo chapado en oro que hace que sea obvio que te encanta la codificación. Muchas felicitaciones para ti. Y no, Stuart, no creo que esto contamine las mentes de los novatos desprevenidos. Con suerte, les enseñará a desarrollar el amor por el software.
Mark Brittingham
2
@Vikash: la conversión de chara en an intevalúa el punto de código del carácter, por lo que la conversión del carácter se 0evalúa como 48. Restar 48 efectivamente hace una conversión a un número entero. Como otro ejemplo, convertir el personaje 5en an intevalúa a 53, y restar 48 de eso da como resultado 5.
John Rasch
31

Prueba esto

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

EDITAR

Varias personas han solicitado la versión loop

public static int GetFirstDigitLoop(int number)
{
    while (number >= 10)
    {
        number = (number - (number % 10)) / 10;
    }
    return number;
}
JaredPar
fuente
1
Recurrencia por algo como esto ... Qué vergüenza. Pon un lazo ahí.
Welbog
@Welbog :), normalmente lo haría. Pero tengo mucha nostalgia en torno a esta cuestión en particular. Fueron casi exactamente las primeras preguntas que me hicieron para una tarea de informática. En ese momento, escribí esencialmente esta solución.
JaredPar
Este es el caso donde "agradable" = lento
Keltex
Espero que el optimizador vea la primera versión como algo que puede ser optimizado para llamadas finales, en cuyo caso no sería más lento.
rmeador
1
Pero, @Jared, la resta del último dígito es completamente innecesaria aquí. Simplemente divida por 10.
Konrad Rudolph
26

Lo mejor que se me ocurre es:

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

int firstDigit = value / Math.Pow( 10, numberOfDigits );
Lennaert
fuente
Puede evitar conversiones innecesarias entre números enteros y dobles utilizando divisor = Convert.ToInt32 (Math.Pow (10, Math.Floor (Math.Log10 (valor)))); firstDigit = valor / divisor;
MartinStettner
Desafortunadamente, esto no funciona cuando el valor es 1 (devuelve 0) o si el valor es negativo. La solución es int numberOfDigits = 1 + Convert.ToInt32 (Math.Floor (Math.Log10 (Math.Abs ​​(valor))));
DanDan
18

variación de la respuesta de 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;
Mike Dunlavey
fuente
Creo que lo dejaría en /10y /1000. Aún tiene la ventaja de dividir de manera más agresiva, pero con un poco menos de desorden. +1 para la creatividad :)
Samantha Branham
Me recuerda a una función en bcl que alguien descubrió, el método era bastante feo de leer, pero básicamente estaba haciendo comparaciones en bucle, y agrupaba comparaciones en grupos de diez más o menos, sabiendo que los cpus modernos podrían manejar mejor un grupo de compara a la vez.
meandmycode
Solo es fantásticamente feo porque C # no tiene una forma de generar esos consts en tiempo de compilación (y hacerlo en tiempo de ejecución sería más costoso de lo que está tratando de evitar). En un lenguaje como Lisp, donde controlas el tiempo de evaluación, la forma rápida y la forma elegante son las mismas. :-)
Ken
Desenrollar un bucle es ciertamente mejor que una tonelada de declaraciones if / else. Es elegante y de alto rendimiento.
Randolpho
3
si hace el primer "si" un "mientras", también funciona con 64 bits (pero es aún más "feo"). +1
MartinStettner
5
int myNumber = 8383;
char firstDigit = myNumber.ToString()[0];
// char = '8'
jgauffin
fuente
¿No es esto idéntico a lo que publiqué? Solo usa [] en lugar de Substring
Dinah
No: devuelve un carácter en lugar de una cadena y la búsqueda [] debería ser más rápida
Joel Coehoorn
Eso es cierto, pero sigue siendo el mismo método básico: analizar la representación de la cadena. Creo que @Dinah está buscando algo ... ya sabes ... diferente.
Randolpho
@Randolpho: exactamente. Lo siento si no estaba claro sobre eso. Actualicé la pregunta para aclarar.
Dinah
También devolvería firstDigit-'0 'para obtener el int. (funciona en c ... supongo que funciona en c #)
Nicolas Irisarri
5

Tenía la misma idea que Lennaert

int start = number == 0 ? 0 : number / (int) Math.Pow(10,Math.Floor(Math.Log10(Math.Abs(number))));

Esto también funciona con números negativos.

Aquino
fuente
4

Si cree que la respuesta de Keltex es fea, pruebe esta, es REALMENTE fea e incluso más rápida. Realiza una búsqueda binaria desenrollada para determinar la longitud.

 ... leading code along the same lines
/* i<10000 */
if (i >= 100){
  if (i >= 1000){
    return i/1000;
  }
  else /* i<1000 */{
    return i/100;
  }
}
else /* i<100*/ {
  if (i >= 10){
    return i/10;
  }
  else /* i<10 */{
    return i;
  }
}

PS MartinStettner tuvo la misma idea.

Mike Dunlavey
fuente
@Rasch: ¡Ah, el rapto! Debe ocultarse, sacarse solo para ocasiones especiales y leerse en voz baja ... ¿Quién dice que la programación no tiene alma?
Mike Dunlavey
qué tali=(...moreugly...)i>=100?i>=1000?i/1000:i/100:i>=10?i/10:i;
David Murdoch
3

Un enfoque matemático obvio, pero lento, es:

int firstDigit = (int)(i / Math.Pow(10, (int)Math.Log10(i))));
mqp
fuente
Calcula el tiempo, no debería ser lento en absoluto. Esta iba a ser mi sugerencia, y dado que es una solución puramente matemática sin bucles, posiblemente sea más rápida que muchas soluciones aquí. Tenga en cuenta que todos los procesadores x86 vendidos hoy en día tienen un procesador de punto flotante muy, muy rápido y capaz.
Adam Davis
Creo que realmente deberías usar Math.Log10 aquí
MartinStettner
Gracias, Martin. No uso mucho las bibliotecas matemáticas .NET y olvidé que era Log y Log10 en lugar de Log y Ln.
mqp
Bueno, Adam, como mínimo debe tomar 10 ^ (N-1) (n es el número de dígitos) más debe tomar un logaritmo. En comparación con una respuesta en bucle (donde está dividiendo N - 1 veces), me parece que debe ser al menos un poco más lento. Pero regularmente me sorprenden los puntos de referencia, así que quién sabe.
mqp
1
Además, el OP pidió una expresión más significativa, sin importar el desempeño, y esta es la forma más directa (matemática) de expresar lo que se busca.
harpo
3
int temp = i;
while (temp >= 10)
{
    temp /= 10;
}

Resulta en temp

Douglas Leeder
fuente
@ck: ¿Qué redondeo emitido? La división es una división entera en este caso, cada división corta exactamente el último dígito ...
MartinStettner
3

Sé que no es C #, pero es sorprendentemente curioso que en Python "obtener el primer carácter de la representación de cadena del número" sea más rápido.

EDITAR : no, cometí un error, olvidé volver a construir el int, lo siento. La versión desenrollada es la más rápida.

$ cat first_digit.py
def loop(n):
    while n >= 10:
        n /= 10
    return n

def unrolled(n):
    while n >= 100000000: # yea... unlimited size int supported :)
        n /= 100000000
    if n >= 10000:
        n /= 10000
    if n >= 100:
        n /= 100
    if n >= 10:
        n /= 10
    return n

def string(n):
    return int(str(n)[0])
$ python -mtimeit -s 'from first_digit import loop as test' \
    'for n in xrange(0, 100000000, 1000): test(n)'
10 loops, best of 3: 275 msec per loop
$ python -mtimeit -s 'from first_digit import unrolled as test' \
    'for n in xrange(0, 100000000, 1000): test(n)'
10 loops, best of 3: 149 msec per loop
$ python -mtimeit -s 'from first_digit import string as test' \
    'for n in xrange(0, 100000000, 1000): test(n)'
10 loops, best of 3: 284 msec per loop
$
ZeD
fuente
Pero, ¿lo vuelve a convertir en un número entero?
Samuel
woops, ahora tiene sentido -.-
ZeD
bueno, podría decir que fue IronPython para hacer esto un poco menos fuera de tema
Ravi
3

Me encontré con esta vieja pregunta y me sentí inclinado a proponer otra sugerencia, ya que ninguna de las otras respuestas hasta ahora devuelve el resultado correcto para todos los valores de entrada posibles y aún se puede hacer más rápido:

public static int GetFirstDigit( int i )
{
    if( i < 0 && ( i = -i ) < 0 ) return 2;
    return ( i < 100 ) ? ( i < 1 ) ? 0 : ( i < 10 )
            ? i : i / 10 : ( i < 1000000 ) ? ( i < 10000 )
            ? ( i < 1000 ) ? i / 100 : i / 1000 : ( i < 100000 )
            ? i / 10000 : i / 100000 : ( i < 100000000 )
            ? ( i < 10000000 ) ? i / 1000000 : i / 10000000
            : ( i < 1000000000 ) ? i / 100000000 : i / 1000000000;
}

Esto funciona para todos los valores enteros con signo inclusive, -2147483648que es el entero con signo más pequeño y no tiene una contraparte positiva. Math.Abs( -2147483648 )disparadores una System.OverflowExceptiony - -2147483648computa a-2147483648 .

La implementación puede verse como una combinación de las ventajas de las dos implementaciones más rápidas hasta ahora. Utiliza una búsqueda binaria y evita divisiones superfluas. Un punto de referencia rápido con el índice de un bucle con 100.000.000 de iteraciones muestra que es dos veces más rápido que la implementación más rápida actualmente.

Termina después de 2.829.581 tics.

A modo de comparación, también medí una variante corregida de la implementación más rápida actualmente que tomó 5,664,627 ticks.

public static int GetFirstDigitX( int i )
{
    if( i < 0 && ( i = -i ) < 0 ) return 2;
    if( i >= 100000000 ) i /= 100000000;
    if( i >= 10000 ) i /= 10000;
    if( i >= 100 ) i /= 100;
    if( i >= 10 ) i /= 10;
    return i;
}

La respuesta aceptada con la misma corrección necesitó 16,561,929 ticks para esta prueba en mi computadora.

public static int GetFirstDigitY( int i )
{
    if( i < 0 && ( i = -i ) < 0 ) return 2;
    while( i >= 10 )
        i /= 10;
    return i;
}

Se puede probar fácilmente que funciones simples como estas son correctas, ya que la iteración de todos los valores enteros posibles no toma mucho más que unos pocos segundos en el hardware actual. Esto significa que es menos importante implementarlos de una manera excepcionalmente legible, ya que simplemente nunca será necesario corregir un error dentro de ellos más adelante.

x4u
fuente
2

Muy simple (y probablemente bastante rápido porque solo involucra comparaciones y una división):

if(i<10)
   firstdigit = i;
else if (i<100)
   firstdigit = i/10;
else if (i<1000)
   firstdigit = i/100;
else if (i<10000)
   firstdigit = i/1000;
else if (i<100000)
   firstdigit = i/10000;
else (etc... all the way up to 1000000000)
Keltex
fuente
1
¿Y luego hay 10k, 100k, 1mil, 10mil, 100mil y así sucesivamente?
Pawel Krakowiak
Yo lo haría de esta manera. Mucho más eficiente que esa función recursiva.
Keltex
Esta respuesta es la mejor del grupo.
Brian
Eficiencia comprada a expensas de un código realmente realmente feo, repetitivo e inmaterial. ¿Y si te hubieras saltado un rango accidentalmente? ¡Ups!
Randolpho
Realmente debería reordenar esas condiciones para que lo más probable sea que estén en la parte superior ...
Jason Punyon
1

Hice algunas pruebas con uno de mis compañeros de trabajo aquí y descubrí que la mayoría de las soluciones no funcionan para números inferiores a 0.

  public int GetFirstDigit(int number)
    {
        number = Math.Abs(number); <- makes sure you really get the digit!

        if (number < 10)
        {
            return number;
        }
        return GetFirstDigit((number - (number % 10)) / 10);
    }
Younes
fuente
1

Usando todos los ejemplos a continuación para obtener este código:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;

namespace Benfords
{
    class Program
    {
        static int FirstDigit1(int value)
        {
            return Convert.ToInt32(value.ToString().Substring(0, 1));
        }

        static int FirstDigit2(int value)
        {
            while (value >= 10) value /= 10;
            return value;
        }


        static int FirstDigit3(int value)
        {
            return (int)(value.ToString()[0]) - 48;
        }

        static int FirstDigit4(int value)
        {
            return (int)(value / Math.Pow(10, (int)Math.Floor(Math.Log10(value))));
        }

        static int FirstDigit5(int value)
        {
            if (value < 10) return value;
            if (value < 100) return value / 10;
            if (value < 1000) return value / 100;
            if (value < 10000) return value / 1000;
            if (value < 100000) return value / 10000;
            if (value < 1000000) return value / 100000;
            if (value < 10000000) return value / 1000000;
            if (value < 100000000) return value / 10000000;
            if (value < 1000000000) return value / 100000000;
            return value / 1000000000;
        }

        static int FirstDigit6(int value)
        {
            if (value >= 100000000) value /= 100000000;
            if (value >= 10000) value /= 10000;
            if (value >= 100) value /= 100;
            if (value >= 10) value /= 10;
            return value;
        }

        const int mcTests = 1000000;

        static void Main(string[] args)
        {
            Stopwatch lswWatch = new Stopwatch();
            Random lrRandom = new Random();

            int liCounter;

            lswWatch.Start();
            for (liCounter = 0; liCounter < mcTests; liCounter++)
                FirstDigit1(lrRandom.Next());
            lswWatch.Stop();
            Console.WriteLine("Test {0} = {1} ticks", 1, lswWatch.ElapsedTicks);

            lswWatch.Reset();
            lswWatch.Start();
            for (liCounter = 0; liCounter < mcTests; liCounter++)
                FirstDigit2(lrRandom.Next());
            lswWatch.Stop();
            Console.WriteLine("Test {0} = {1} ticks", 2, lswWatch.ElapsedTicks);

            lswWatch.Reset();
            lswWatch.Start();
            for (liCounter = 0; liCounter < mcTests; liCounter++)
                FirstDigit3(lrRandom.Next());
            lswWatch.Stop();
            Console.WriteLine("Test {0} = {1} ticks", 3, lswWatch.ElapsedTicks);

            lswWatch.Reset();
            lswWatch.Start();
            for (liCounter = 0; liCounter < mcTests; liCounter++)
                FirstDigit4(lrRandom.Next());
            lswWatch.Stop();
            Console.WriteLine("Test {0} = {1} ticks", 4, lswWatch.ElapsedTicks);

            lswWatch.Reset();
            lswWatch.Start();
            for (liCounter = 0; liCounter < mcTests; liCounter++)
                FirstDigit5(lrRandom.Next());
            lswWatch.Stop();
            Console.WriteLine("Test {0} = {1} ticks", 5, lswWatch.ElapsedTicks);

            lswWatch.Reset();
            lswWatch.Start();
            for (liCounter = 0; liCounter < mcTests; liCounter++)
                FirstDigit6(lrRandom.Next());
            lswWatch.Stop();
            Console.WriteLine("Test {0} = {1} ticks", 6, lswWatch.ElapsedTicks);

            Console.ReadLine();
        }
    }
}

Obtengo estos resultados en un AMD Ahtlon 64 X2 Dual Core 4200+ (2.2 GHz):

Test 1 = 2352048 ticks
Test 2 = 614550 ticks
Test 3 = 1354784 ticks
Test 4 = 844519 ticks
Test 5 = 150021 ticks
Test 6 = 192303 ticks

Pero consígalos en un AMD FX 8350 de ocho núcleos (4,00 GHz)

Test 1 = 3917354 ticks
Test 2 = 811727 ticks
Test 3 = 2187388 ticks
Test 4 = 1790292 ticks
Test 5 = 241150 ticks
Test 6 = 227738 ticks

Entonces, si el método 5 o 6 es más rápido o no depende de la CPU, solo puedo suponer que esto se debe a que la predicción de rama en el procesador de comandos de la CPU es más inteligente en el nuevo procesador, pero no estoy realmente seguro.

No tengo ninguna CPU Intel, ¿tal vez alguien pueda probarlo por nosotros?

Aaron Murgatroyd
fuente
1

Mira este también:

int get1digit(Int64 myVal)
{
    string q12 = myVal.ToString()[0].ToString();
    int i = int.Parse(q12);
    return i;
}

También es bueno si quieres varios números:

int get3digit(Int64 myVal) //Int64 or whatever numerical data you have
{
    char mg1 = myVal.ToString()[0];
    char mg2 = myVal.ToString()[1];
    char mg3 = myVal.ToString()[2];
    char[] chars = { mg1, mg2, mg3 };
    string q12= new string(chars);
    int i = int.Parse(q12);
    return i;
}
teodoric8.
fuente
¿Podría agregar alguna explicación a su respuesta? Esta pregunta ya tiene otras 24 respuestas; sería bueno saber por qué deberíamos usar la suya en lugar de las otras.
Wai Ha Lee
Con la solución original, obtuve algunos errores al usar números grandes. Mi solución es más limpia. De nada.
teodorico8.
Tu solución falla -1.
Wai Ha Lee
:) usa esto entonces: if (myVal.ToString () [0]! = '-') {....} y - ¡el signo no es un número!
teodorico8.
¿Por qué no comprobar que el número no sea negativo en lugar de comprobar la cadena?
Wai Ha Lee
0
while (i > 10)
{
   i = (Int32)Math.Floor((Decimal)i / 10);
}
// i is now the first int
cjk
fuente
¿Por qué está convirtiendo a decimal? Además, no se necesita piso.
MartinStettner
Estaba allí para posibles problemas de redondeo, que en realidad no son necesarios.
cjk
Debe ser while (i> = 10) o esto fallará para múltiplos de 10.
Bill the Lizard
0

Fórmula no iterativa:

public static int GetHighestDigit(int num)
{
    if (num <= 0)
       return 0; 

    return (int)((double)num / Math.Pow(10f, Math.Floor(Math.Log10(num))));
}
Trigo Mitch
fuente
La implementación de Log es iterativa ya que requiere un algoritmo de búsqueda de raíces
Jasper Bekkers
0

Solo para darle una alternativa, puede dividir repetidamente el número entero entre 10 y luego revertir un valor una vez que llegue a cero. Dado que las operaciones de cadenas son generalmente lentas, esto puede ser más rápido que la manipulación de cadenas, pero de ninguna manera es elegante.

Algo como esto:

while(curr>=10)
     curr /= 10;
Josh Jordan
fuente
Haga la condición while (curr> 10) y no necesita prevValue
MartinStettner
> = es necesario. El primer dígito de 10 debe ser 1, no 10
Dinah
0
start = getFirstDigit(start);   
public int getFirstDigit(final int start){
    int number = Math.abs(start);
    while(number > 10){
        number /= 10;
    }
    return number;
}

o

public int getFirstDigit(final int start){
  return getFirstDigit(Math.abs(start), true);
}
private int getFirstDigit(final int start, final boolean recurse){
  if(start < 10){
    return start;
  }
  return getFirstDigit(start / 10, recurse);
}
sdellysse
fuente
Debería funcionar ahora. También se agregó una función recursiva con trampa para abdominales.
sdellysse
0
int start = curr;
while (start >= 10)
  start /= 10;

Esto es más eficiente que un enfoque ToString () que internamente debe implementar un bucle similar y tiene que construir (y analizar) un objeto de cadena en el camino ...

MartinStettner
fuente
0

Método muy fácil para obtener el último dígito:

int myInt = 1821;

int lastDigit = myInt - ((myInt/10)*10); // 1821 - 1820 = 1
Daniel
fuente
3
Eso es bueno, pero la pregunta es obtener el primer dígito, no el último.
Dinah
0

Esto es lo que suelo hacer, consulte mi función a continuación:

Esta función puede extraer la aparición del primer número de cualquier cadena que pueda modificar y usar esta función de acuerdo con su uso

   public static int GetFirstNumber(this string strInsput)
    {
        int number = 0;
        string strNumber = "";
        bool bIsContNo = true;
        bool bNoOccued = false;

        try
        {
            var arry = strInsput.ToCharArray(0, strInsput.Length - 1);

            foreach (char item in arry)
            {
                if (char.IsNumber(item))
                {
                    strNumber = strNumber + item.ToString();

                    bIsContNo = true;

                    bNoOccued = true;
                }
                else
                {
                    bIsContNo = false;
                }

                if (bNoOccued && !bIsContNo)
                {
                    break;
                }


            }

            number = Convert.ToInt32(strNumber);

        }
        catch (Exception ex)
        {

            return 0;
        }

        return number;

    }
sreeyushs
fuente
-2

Aquí hay una forma más simple que no implica bucles

int number = 1234
int firstDigit = Math.Floor(number/(Math.Pow(10, number.ToString().length - 1))

Eso nos daría 1234 / Math.Pow (10, 4 - 1) = 1234/1000 = 1

Ross Goddard
fuente
No se puede convertir implícitamente el tipo 'double' a 'int'.
Younes
-2
int i = 4567789;
int digit1 = int.Parse(i.ToString()[0].ToString());
jrod
fuente