Форум: "Основная";
Текущий архив: 2002.06.10;
Скачать: [xml.tar.bz2];
ВнизАлгоритм перевода из десятиричной системы исчисления Найти похожие ветки
← →
Sniffer (2002-05-30 06:09) [0]Привет всем! Написал функцию перевода числа из десятиричной системы в заданую. Число длинное, поэтому храню его в String
D - новая система исчисления, N - число. Посмотрите, вы видите в коде ошибку? Спасибо.
type
Rslt = record
Number, Ostatok : String
end;
function DecTo(D : integer; N : String) : Rslt;
var
p, i, j : integer;
Need : integer;
begin
Need := StrToInt(Copy(N, 1, Length(IntToStr(D))));
for i := Length(IntToStr(D)) + 1 to (Length(N) - Length(IntToStr(D))) do
begin
p := Need div D;
j := Need - (D * p);
Need := StrToInt(IntToStr(j) + Copy(N, i, 1));
Result.Number := Concat(Result.Number, IntToStr(j))
end;
Result.Ostatok := IntToStr(j);
end;
← →
Alx2 (2002-05-30 07:31) [1]
function ConvertToNewBase(N : int64; D : Cardinal):String;
// Функция перевода (пока только для целых 64-bit N>0)
begin
Result := "";
while N>0 do
Begin
Result := IntToStr(N mod D)+Result;
N := N div D;
End;
end;
begin
ShowMessage(ConvertToNewBase(10,2)); // Пример использования
end;
← →
Sniffer (2002-05-30 07:34) [2]Со Стрингом, наверно посложнее будет :)
← →
Alx2 (2002-05-30 07:44) [3]С произвольно длинным числом конечно сложнее. Если подходить "в лоб", то надо реализовывать операции взятия остатка и деления как учили в школе - "лесенкой".
← →
Sniffer (2002-05-30 07:57) [4]Я сча это и пытаюсь сделать, только пока безрезультатно :(
← →
Alx2 (2002-05-30 09:11) [5]Лови!
Function StrDiv256(S: String; Remainder: PString = Nil): String;
Function GetNextPart(Var K, cnt: Integer): Integer;
Begin
Result := 0;
While (K <= Length(S)) And (Result < 256) Do
Begin
Result := 10 * Result + (Byte(S[K]) - Byte("0"));
inc(K);
inc(cnt);
End;
End;
Procedure PrepareStr(val: Integer; Var K, cnt: Integer);
Begin
cnt := -1;
While (val > 0) And (K > 0) Do
Begin
dec(K);
S[K] := Char(Byte("0") + (val Mod 10));
val := val Div 10;
dec(cnt);
End;
End;
Var
K, arg, cnt: Integer;
Begin
K := 1;
Result := "";
arg := 0;
cnt := -1;
While K <= Length(S) Do
Begin
arg := GetNextPart(K, cnt);
If cnt > -1 Then
Result := Result + StringOfChar("0", cnt * Byte(Length(Result) <> 0)) + IntToStr(arg Div 256);
If arg < 256 Then break;
PrepareStr(arg Mod 256, K, cnt);
End;
If Remainder <> Nil Then
Remainder^ := IntToStr(arg);
End;
Function ConvertToBase256(N: String): String;
Var S: String;
Begin
Result := "";
While N <> "0" Do
Begin
N := StrDiv256(N, @S);
Result := S + " " + Result;
End;
End;
Begin
Edit1.Text := ConvertToBase256("31783219310831083108");
// - выводит каждый байт через пробел. Твои x,y,z - тройки байтов
// первые три байта - x, вторая тройка - y, третья - z
End;
← →
Alx2 (2002-05-30 10:33) [6]Кстати, если строковые числа представлять с максимальной загрузкой байтов строки, то можно получить довольно эффективный путь для работы с длинной арифметикой. :)
← →
Sniffer (2002-05-30 15:12) [7]>Alx2
Огромное спасисбо!
← →
Alx2 (2002-05-30 15:17) [8]>Sniffer (30.05.02 15:12)
А как обратно переводить будешь? :))
← →
Sniffer (2002-05-30 17:59) [9]Чё-нить придумаю :)
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.06.10;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.006 c