¿Hay alguna manera de convertir cadenas a enteros sin usar Multiplicación? La implementación de int.Parse () también usa la multiplicación. Tengo otras preguntas similares en las que puede convertir manualmente la cadena a int, pero eso también requiere multiplicar el número por su base 10. Esta fue una pregunta de entrevista que tuve en una de las entrevistas y parece que no puedo encontrar ninguna respuesta al respecto.
9
x<<1 + x<<3
), pero sigue siendo una forma de usar la multiplicación, por lo que es difícil decir si eso está "en el espíritu" de la pregunta ...for (int i = 0; i < 10; i++) result += number;
cuentan?Respuestas:
Si asume un sistema de números de base 10 y sustituye la multiplicación por cambios de bits ( vea aquí ), esta puede ser una solución para enteros positivos .
Ver el ejemplo de ideone .
La única suposición es que los personajes
'0'
que'9'
se encuentran directamente junto a la otra en el conjunto de caracteres. Los caracteres de dígitos se convierten a su valor entero usandocharacter - '0'
.Editar:
Para enteros negativos, esta versión ( ver aquí ) funciona.
En general, debe tener en cuenta los errores, como las verificaciones nulas, los problemas con otros caracteres no numéricos, etc.
fuente
Depende. ¿Estamos hablando de la operación lógica de la multiplicación, o cómo se hace realmente en hardware?
Por ejemplo, puede convertir una cadena hexadecimal (u octal, o cualquier otra base dos multiplicador) en un entero "sin multiplicación". Puede ir carácter por carácter y seguir oring (
|
) y bitshifting (<<
). Esto evita usar el*
operador.Hacer lo mismo con las cadenas decimales es más complicado, pero todavía tenemos una suma simple. Puede usar bucles con adición para hacer lo mismo. Bastante simple de hacer. O puede hacer su propia "tabla de multiplicar", ojalá haya aprendido a multiplicar números en la escuela; Puedes hacer lo mismo con una computadora. Y, por supuesto, si está en una computadora decimal (en lugar de binaria), puede hacer el "desplazamiento de bits", al igual que con la cadena hexadecimal anterior. Incluso con una computadora binaria, puede usar una serie de cambios de bits,
(a << 1) + (a << 3)
es lo mismo quea * 2 + a * 8 == a * 10
. Cuidado con los números negativos. Puedes descubrir muchos trucos para hacer esto interesante.Por supuesto, ambos son solo multiplicaciones disfrazadas. Esto se debe a que los sistemas numéricos posicionales son inherentemente multiplicativos . Así es como funciona esa representación numérica particular. Puede tener simplificaciones que ocultan este hecho (por ejemplo, los números binarios solo necesitan
0
y1
, por lo tanto, en lugar de multiplicar, puede tener una condición simple; por supuesto, lo que realmente está haciendo es multiplicar, solo con dos entradas posibles y dos posibles salidas), pero siempre está ahí, al acecho.<<
es lo mismo que* 2
, incluso si el hardware que realiza la operación puede ser más simple y / o más rápido.Para eliminar por completo la multiplicación, debe evitar el uso de un sistema posicional. Por ejemplo, los números romanos son aditivos (nota que los números romanos reales no utilizaron las reglas compactificación que tenemos hoy - cuatro serían
IIII
, noIV
, y los catorce años se podrían escribir en cualquier forma comoXIIII
,IIIIX
,IIXII
,VVIIII
etc.). Convertir una cadena de este tipo en entero se vuelve muy fácil: simplemente vaya carácter por carácter y siga agregando. Si el personaje esX
, suma diez. SiV
, suma cinco. SiI
, Agrega uno. Espero que puedan ver por qué los números romanos siguieron siendo populares durante tanto tiempo; los sistemas numéricos posicionales son maravillosos cuando necesitas hacer muchas multiplicaciones y divisiones. Si se trata principalmente de sumas y restas, los números romanos funcionan muy bien y requieren mucha menos educación (¡y un ábaco es mucho más fácil de hacer y usar que una calculadora posicional!).Con tareas como esta, hay muchos imprevistos sobre lo que el entrevistador realmente espera. Quizás solo quieran ver tus procesos de pensamiento. ¿Adoptas tecnicismos (
<<
no es realmente multiplicación)? ¿Conoces la teoría de números y la informática? ¿Simplemente te sumerges con tu código o pides una aclaración? ¿Lo ve como un desafío divertido, o como otra pregunta ridícula y aburrida de la entrevista que no tiene ninguna relevancia para su trabajo? Es imposible para nosotros decirle la respuesta que estaba buscando el entrevistador.Pero espero al menos darte una idea de las posibles respuestas :)
fuente
Considerando que se trata de una pregunta de entrevista, el desempeño podría no ser una alta prioridad. ¿Por qué no solo:
Si la cadena pasada no es un entero, el método generará una excepción de desbordamiento.
fuente
public int StringToInt(string value, int search_from = int.MinValue) => value == search_from.ToString() ? search_from : StringToInt (value, ++search_from);
Enumerable.Range(int.MinValue, int.MaxValue).First(i => i.ToString() == stringValue
.Cualquier multiplicación puede ser reemplazada por la suma repetida. Por lo tanto, puede reemplazar cualquier multiplicación en un algoritmo existente con una versión que solo use la suma:
Podría ir más allá y escribir una Cadena especializada para Int usando esta idea que minimiza el número de adiciones (número negativo y manejo de errores omitidos por brevedad):
Pero no creo que valga la pena, ya que el rendimiento no parece ser una preocupación aquí.
fuente