|
|
Регистрация | << Правила форума >> | 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; Начинающий программист уверен, что в 1 килобайте 1000 байт.
Законченный программист уверен, что в 1 километре 1024 метра. |
#6
|
||||
|
||||
мой код правильный. любое число длиной в 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 может препода не устраивать. РГРТУ - ФВТ - Системы Автоматизированного ПРоектирования. ت |
#7
|
||||
|
||||
Код:
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; |
#8
|
|||
|
|||
Цитата:
тем что мне надо это использовать на pascal'е, а там подобных функций нет.. в математике я не силен, так что строчка Код:
r:=r+ (Ord(s[i])-Ord('0'))*Round( Exp( (Length(s)-i)*Ln(10) ) ) остается для меня загадочной и главное - рабочей.. (особенно этот момент: Exp((Length(s)-i)*Ln(10))) ) |
#9
|
||||
|
||||
Как это нет??? там есть процедуры Val и Str.
Exp((Length(s)-i)*Ln(10)) это e^[ln(10)^(номер разряда-1)], т.е. 10^(номер разряда-1). В паскале как раз функции Power нет и нужно использовать искусственный прием. а лучше как s0Creator написал (опять я забыл про накопление ) РГРТУ - ФВТ - Системы Автоматизированного ПРоектирования. ت |