![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
|
|
#1
|
|||
|
|||
|
Помогите описать функцию перевода из строки в число, не используя стандартные ( strtoint() ). Заранее спасибо!
|
|
#2
|
|||
|
|||
|
Элементарно, Ватсон.
Идем с конца строки посимвольно и складываем ([код символа] - [код '1']) * [номер символа с конца строки]. |
|
#3
|
||||
|
||||
|
немного не так...даже совсем не так. а вот так правильно:
Код:
function StringToInt(s:string):integer;
var i, r:integer;
begin
r:=0;
for i:=Length(s) downto 1 do
begin
if (s[i] in ['0'..'9'])then
r:=r+ (Ord(s[i])-Ord('0'))*Round( Exp( (Length(s)-i)*Ln(10) ) )
else
begin //в строке не число
r:=0;
break;
end;
end;
Result:=r;
end;Последний раз редактировалось KOOL, 05.03.2009 в 12:34. |
|
#4
|
|||
|
|||
|
может я чтото не так делаю по сетоду Imikle или не понял.. (спс за нижеприведенный код)
Код:
function sti(str: string): int64;
var
i: integer;
f: int64;
begin
f:=0;
for i:= Length(str) downto 0 do
f:= f + (ord(str[i])-ord('1'))*(Length(str)+1);
result := f;
end;Последний раз редактировалось ApplicatiOn, 06.03.2009 в 23:52. |
|
#5
|
||||
|
||||
|
А у меня такая штука получилась...
Код:
function XPower(const x, y: Integer): Integer;
var
i: Integer;
begin
Result:= x;
i:= 1;
while i < y do
begin
Result:= Result * x;
Inc(i);
end;
end;
function sti(s: string): int64;
var
i, j, l, x: integer;
f, y: int64;
begin
f:= 0; j:= 0;
x:= Ord('0');
l:= Length(s);
for i:= l downto 1 do
begin
y:= (Ord(s[i]) - x);
if j > 0 then y:= y * XPower(10, j);
Inc(f, y);
Inc(j);
end;
Result:= f;
end; |
|
#6
|
|||
|
|||
|
Цитата:
тем что мне надо это использовать на pascal'е, а там подобных функций нет.. в математике я не силен, так что строчка Код:
r:=r+ (Ord(s[i])-Ord('0'))*Round( Exp( (Length(s)-i)*Ln(10) ) )остается для меня загадочной и главное - рабочей.. (особенно этот момент: Exp((Length(s)-i)*Ln(10))) ) |
|
#7
|
||||
|
||||
|
Как это нет??? там есть процедуры Val и Str.
Exp((Length(s)-i)*Ln(10)) это e^[ln(10)^(номер разряда-1)], т.е. 10^(номер разряда-1). В паскале как раз функции Power нет и нужно использовать искусственный прием. а лучше как s0Creator написал (опять я забыл про накопление ) |
|
#8
|
||||
|
||||
|
мой код правильный. любое число длиной в n разрядов в q-ричной системе счисления определяется как
An*q^(n-1) + A(n-1)*q^(n-2) + ... + A2*q^1 + A1*q^0 , где An-цифра, стоящая в n-ном разряде. насчет твоего кода: Код:
for i:= Length(str) downto 0 do Код:
f:= f + (ord(str[i])-ord('1'))*(Length(str)+1);Length(str)+1 - эт вообще не то, что надо. если по этому коду перевести строку, то получится: строка='135'; 5: 4*4=16 + 3: 2*4=8 + 1: 0*4=0 24 то есть код совсем неправильный 2Karsh: избыточности много. такие вещи, как Ord('<символ>'), являются константами. значение length(s) используется 1 раз, присваивать значение функции, используемой меньше 2 раз, переменной - это дурной тон. а математические функции типа возведения в степень пишут на языке ассемблера. а функция val может препода не устраивать. |
|
#9
|
||||
|
||||
|
Код:
function sti(s: string): int64;
var
i, x : integer;
begin
Result := 0;
s := Trim(s);
x := Ord('0');
for i := 1 to Length(s) do
begin
if not (s[i] in ['0'..'9'])then
begin
Result := 0;
exit;
end;
Result := (Result * 10) + (Ord(s[i]) - x);
end;
end;
|