Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 01-09-2016
andrecuellar andrecuellar is offline
Miembro
NULL
 
Registrado: sep 2015
Posts: 13
Poder: 0
andrecuellar Va por buen camino
Smile Obtener un dígito en una posición

Buenas, ya voy aproximadamente un año con delphi y le entiendo perfectamente bien, pero me dejaron un problema que la verdad hasta ahora me ha dejado mal parado, no puedo hacerlo y da para pensar, me han puesto una condición (sin usar for, while, repeat y todo lo que viene a ser ciclo repetitivo), el problema es el siguiente:

Escribir el código de un programa en delphi en modo consola que pida dos números N y K donde se muestre el dígito que se encuentre en la posición K del número N ( Sin usar ciclos repetitivos )

ejemplo:
N:= 1248935
K:= 4
result:= 8

El problema este me pone pensativo cuando me pidieron no usar while, ni for, ni repeat, alguien tiene alguna solución o aporte que pueda servir? Uso tanto los ciclos que no se me ocurre como hacerlo sin ellos. Por favor. Gracias de antemano

Quizás podría solucionarse con una fórmula que se usa para contar el número de dígitos, que la verdad nunca se me habría ocurrido
Código Delphi [-]
digitos:= trunc(Ln(N)/Ln(10))+1;
Responder Con Cita
  #2  
Antiguo 01-09-2016
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is online now
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Recuerda poner títulos descriptivos a tus preguntas, gracias.
Responder Con Cita
  #3  
Antiguo 01-09-2016
andrecuellar andrecuellar is offline
Miembro
NULL
 
Registrado: sep 2015
Posts: 13
Poder: 0
andrecuellar Va por buen camino
Cita:
Empezado por Casimiro Notevi Ver Mensaje
Recuerda poner títulos descriptivos a tus preguntas, gracias.
Editado, gracias
Responder Con Cita
  #4  
Antiguo 01-09-2016
JOSEPE JOSEPE is offline
Miembro
 
Registrado: feb 2005
Posts: 45
Poder: 0
JOSEPE Va por buen camino
Pues eso es lo que tienes que hacer, usar logaritmos y exponenciales sobre base 10. Realmente no es dificil.

Otra forma un poco "chueca" que creo no es la idea, es pasar el numero a string, y de ahi hacer referencia al caracter apropiado.
Responder Con Cita
  #5  
Antiguo 01-09-2016
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola andrecuellar.

¿ Ya revisaste los enlaces que hay al pié de esta página ?

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #6  
Antiguo 01-09-2016
andrecuellar andrecuellar is offline
Miembro
NULL
 
Registrado: sep 2015
Posts: 13
Poder: 0
andrecuellar Va por buen camino
Cita:
Empezado por ecfisa Ver Mensaje
Hola andrecuellar.

¿ Ya revisaste los enlaces que hay al pié de esta página ?

Saludos
no lo había visto, pero las soluciones que dan son con manejo de cadenas (no es con manejo de cadenas tampoco que se debe hacer), o también se las dan con ciclos repetitivos, que si pudiera usarlos entonces ya lo habría hecho, de todas maneras gracias
Responder Con Cita
  #7  
Antiguo 02-09-2016
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola.

Fijate si te sirve de este modo:
Código Delphi [-]
function DigitAtPos(Number: LongInt; Position: Byte): Integer;
var
  len: Integer;
begin
  Number := Abs(Number);
  len    := Trunc(ln(Number)/ln(10))+1;
  if (Number = 0) or (Position <= 0) or (Position > len) then
    Result := -1
  else
  begin
    Position := len - Position + 1;
    Result   := Number div Trunc(Exp(Ln(10)*(Position-1))) mod 10;
  end;
end;

Uso:
Código Delphi [-]
...
  Writeln(DigitAtPos(-1248935, 6)); //  -> 3

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #8  
Antiguo 02-09-2016
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Dos soluciones no iterativas:

1. Variante de la de ecfisa:

Código Delphi [-]
function DigitAtPos(N: LongInt; K: Byte): Integer;
begin
  Result := (N div Trunc(IntPower(10, K))) mod 10;
end;

2. Versión recursiva

Código Delphi [-]
function DigitAtPosR(N: LongInt; K: Byte): Integer;
begin
  if K = 0 then
    Result := N mod 10
  else
    Result := DigitAtPosR(N div 10, K - 1);
end;

En ambos casos, los dígitos se cuentan desde el 0 de derecha a izquierda.

LineComment Saludos

Última edición por roman fecha: 02-09-2016 a las 17:51:40. Razón: Me equivoqué de autor de la otra versión.
Responder Con Cita
  #9  
Antiguo 06-09-2016
andrecuellar andrecuellar is offline
Miembro
NULL
 
Registrado: sep 2015
Posts: 13
Poder: 0
andrecuellar Va por buen camino
Gracias a todos!

Gracias a todos! al final terminé usando esto que igual me sirvió
Lo voy a poner todo en uno en consola para no estar separando todo en funciones

Código Delphi [-]
program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;
var N, D, NumDigits, r, valordig: integer; K: byte;
begin
readln(N);
readln(k);
 NumDigits:= trunc(Ln(N)/Ln(10))+1;
 D:= trunc(exp((NumDigits-k)*Ln(10)));
 r:= n div D;
 r:= r mod 10;
Writeln('El valor del digito es: ',r);
readln;
end.

Muchas gracias a todos los que me ayudaron, simplemente tenía que usar la "fórmula" para obtener el número de dígitos y luego usar otra. Gracias!

Tema resuelto
Responder Con Cita
  #10  
Antiguo 07-09-2016
Avatar de BDWONG
BDWONG BDWONG is offline
Miembro
NULL
 
Registrado: nov 2013
Posts: 113
Poder: 11
BDWONG Va por buen camino
Hola si en tu caso todo es valido excepto los ciclos repetitivos puedes probar tambien con esta alternativa

Código Delphi [-]
function DigitAtPos(N: DWord;K:Byte): Dword;
begin
 Result:=0;
 if (N>=K) and (K>0) then
    Result:=ord(IntToStr(N)[k])-$30;
end;


begin
   WriteLn(DigitAtPos(1248935,4));
   ReadLn;
end.

SALUDOS

Última edición por BDWONG fecha: 07-09-2016 a las 05:03:18.
Responder Con Cita
  #11  
Antiguo 07-09-2016
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
Cita:
Empezado por BDWONG Ver Mensaje
Código Delphi [-]
function DigitAtPos(N: DWord;K:Byte): Dword;
begin
 Result:=0;
 if (N>=K) and (K>0) then
    Result:=ord(IntToStr(N)[k])-$30;
end;

begin
   WriteLn(DigitAtPos(1248935,4));
   ReadLn;
end.
Ese codigo lo veo y no entiendo nada es como si estuviese cifrado.. es peor que leer C

Fuera de bromas, realmente no lo entiendo, en donde esta el "truco"?
Responder Con Cita
  #12  
Antiguo 07-09-2016
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por AgustinOrtu Ver Mensaje
Fuera de bromas, realmente no lo entiendo, en donde esta el "truco"?
Convierte el número en una cadena, toma el k-ésimo caracter y lo devuelve restándole $30 que es el código ascii del 0, es decir, conviertiendo el caracter de vuelta en número.

De todas formas, ya en el mensaje #6 se había establecido que no podían usarse cadenas.

LineComment Saludos
Responder Con Cita
  #13  
Antiguo 07-09-2016
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
Cita:
Empezado por roman Ver Mensaje
Convierte el número en una cadena, toma el k-ésimo caracter y lo devuelve restándole $30 que es el código ascii del 0, es decir, conviertiendo el caracter de vuelta en número
Gracias por explicarlo roman, la verdad no conocia ese "truquito" jugando con la tabla de ASCII. O bueno, en realidad lo mas preciso es decir que no lo recordaba, eso creo que lo vi alguna vez cuando nos enseñaban assembler
Responder Con Cita
  #14  
Antiguo 07-09-2016
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Quizá sería más claro restarle Ord('0') en lugar de $30

LineComment Saludos
Responder Con Cita
  #15  
Antiguo 07-09-2016
Avatar de BDWONG
BDWONG BDWONG is offline
Miembro
NULL
 
Registrado: nov 2013
Posts: 113
Poder: 11
BDWONG Va por buen camino
Joder no había visto el mensaje 6 lo siento, AgustinOrtu no creo que sea tan criptico el código he visto peores
Saludos...
Responder Con Cita
  #16  
Antiguo 07-09-2016
Avatar de BDWONG
BDWONG BDWONG is offline
Miembro
NULL
 
Registrado: nov 2013
Posts: 113
Poder: 11
BDWONG Va por buen camino
Pequeña variante de román cuenta los dígitos de izquierda a derecha

Código Delphi [-]
function DigitAtPos(N,K: Dword): DWord;
var e: DWord;
begin
   Result:=0;
   e:=(trunc(Ln(N)/Ln(10))+1);

   if K<=e then Result:=(N div trunc(intpower(10,e-K)))mod 10;
end;

begin
  Writeln(DigitAtPos(1248935,4));
  ReadLn;
end.

Última edición por BDWONG fecha: 07-09-2016 a las 20:00:13.
Responder Con Cita
  #17  
Antiguo 07-09-2016
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola.

Una observación sobre alguna de las variantes expuestas. Dado que realizan un conteo de base 0 (0, 1, 2, ...) la función debería devolver un valor distinto a 0 para señalizar un resultado inválido.

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Obtener determinado dígito de un número xneox Varios 10 07-10-2012 01:43:22
Pago Fácil, obtener dígito verificador DamianG Varios 3 25-09-2012 20:30:45
Eliminar un digito y mostrar el digito eliminado luisito2011 Varios 17 01-04-2011 05:27:17
Obtener la posición del cursor en un memo serg Varios 1 03-03-2008 00:21:47
Comparar un number dígito a dígito kuan-yiu SQL 2 25-06-2007 17:26:47


La franja horaria es GMT +2. Ahora son las 21:06:08.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi