Cita:
Empezado por eduarcol
a ver si entendi lo que explicas, necesitas recursividad, algo como esto:
|
Bueno, y porque no usar los conceptos de las conversiones Binarias, decimales, octales, hexadecimales, pues nos hacemos de una nueva
Base36.
Código Delphi
[-]
unit UBase36;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Buttons, Math;
type
TForm1 = class(TForm)
BitBtn1: TBitBtn;
Label2: TLabel;
Edit1: TEdit;
procedure BitBtn1Click(Sender: TObject);
private
public
end;
const
Base36 : Array[0..35] of char = ('0','1','2','3','4','5','6','7','8',
'9','A','B','C','D','E','F','G','H',
'I','J','K','L','M','N','O','P','Q',
'R','S','T','U','V','W','X','Y','Z');
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.BitBtn1Click(Sender: TObject);
var
Suma,Numero: Extended;
PosCaracter,Indice: Integer;
function ConvABase36(N:Extended):String;
var
Cadena: string;
Dividendo,Resultado,Residuo: Extended;
begin
Cadena := '';
Dividendo := N;
REPEAT
Resultado := Dividendo / 36;
Residuo := (Resultado - Trunc(Resultado)) * 36;
Cadena := Base36[Trunc(Residuo)]+ Cadena;
Dividendo := Resultado;
UNTIL Resultado < 36;
Result := Base36[Trunc(Dividendo)]+Cadena;
end;
function ConvADecimal(B36:string):Extended;
function GetIndex(Value: Char): Integer;
begin
Result := Byte(Value) - 48;
if Result > 9 then Dec(Result, 7);
end;
begin
Indice := 0;
PosCaracter := length(B36);
REPEAT
Suma := Suma + GetIndex(B36[PosCaracter]) * Power(36,Indice);
Indice := Indice + 1;
Dec(PosCaracter);
UNTIL Indice = (length(B36)-1);
Result := Suma;
end;
begin
Numero := ConvADecimal('~'+Edit1.Text)+1; Label2.Caption := ConvABase36(Numero); end;
end.
Ahora, podemos sumar a cualquier cadena que nos coloquen, por ejemplo
LX345J8ON99.
Nota: No se porque, pero solo suma correctamente hasta 12 digitos, pues bien, habría que mejorar este código.
Salud OS