Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > сравнивание больших чисел


Автор: valerchi 21.11.2010, 16:43
Мужики, помогите, может кто знает, есть ли такая функция сравнивания (< > =) больших чисел с типом string? 

Автор: Wildklas 21.11.2010, 17:35
Сначала нужно подсчитать кол-во символов в строчке с помощью ф-и Length(Str), тоесть 
Код

S:=Length(str);

а потом уже сравнивать.

Автор: valerchi 21.11.2010, 20:50
Не хочется изобретать велосипед.  Может есть готовая функция?

Автор: THandle 21.11.2010, 22:22
Код

function Compare(const AS1, AS2: String): Integer;
var
  Len1, Len2: Integer;
begin
  Len1 := Length(AS1);
  Len2 := Length(AS2);
  if Len1 <> Len2 then
    if Len1 > Len2 then
      Result := 1
    else
      Result := -1
  else
    Result := CompareStr(AS1, AS2);
end;


Что нибудь типа этого думаю.
Положительное значение результата - 1 число больше, отрицательное - меньше. Если равны то 0.

Автор: Keeper89 21.11.2010, 22:22
Цитата(valerchi @  21.11.2010,  16:43 Найти цитируемый пост)
Мужики, помогите, может кто знает, есть ли такая функция сравнивания (< > =) больших чисел с типом string?  

Что имеется ввиду?

Автор: valerchi 22.11.2010, 00:42
THandle, Спасибо, выручил.

Автор: northener 22.11.2010, 04:01
Цитата(valerchi @  21.11.2010,  16:43 Найти цитируемый пост)
Мужики, помогите, может кто знает, есть ли такая функция сравнивания (< > =) больших чисел с типом string? 


Цитата(valerchi @  22.11.2010,  00:42 Найти цитируемый пост)
THandle, Спасибо, выручил. 


А заодно и "кинул подлянку". smile

Автор: valerchi 22.11.2010, 09:45
Цитата(northener @ 22.11.2010,  04:01)
Цитата(valerchi @  21.11.2010,  16:43 Найти цитируемый пост)
Мужики, помогите, может кто знает, есть ли такая функция сравнивания (< > =) больших чисел с типом string? 


Цитата(valerchi @  22.11.2010,  00:42 Найти цитируемый пост)
THandle, Спасибо, выручил. 


А заодно и "кинул подлянку". smile

Какую подлянку?

Автор: valerchi 22.11.2010, 10:07
Keeper89, 
Цитата(Keeper89 @  21.11.2010,  22:22 Найти цитируемый пост)
Цитата(valerchi @  21.11.2010,  16:43 Найти цитируемый пост)
Мужики, помогите, может кто знает, есть ли такая функция сравнивания (< > =) больших чисел с типом string?  


Что имеется ввиду?

Имеется ввиду, что числа в длинной арифметике записываются как строка (тип string)? и я спросил, есть ли такая функция, которая может сравнить и определить, какое из двух сравниваемых чисел, записанных в строку, больше, а какое меньше, или может они равны...

Автор: ama_kid 22.11.2010, 10:35
Цитата(valerchi @  22.11.2010,  10:45 Найти цитируемый пост)
Какую подлянку?
Ну подлянку - не подлянку, для тривиальных случаев проканает, просто внимательно надо пользоваться, к примеру, избавляться от ведущих и хвостовых нулей:
Код
Compare('0123456789','123456789');
Compare('0.1','0.10');
Но не от всяких:
Код
Compare('0.12345678','.123456789')
Да и не только от нулей:
Код
Compare('123456789.0','123456789');
Но самая главная - проблема со знаками, их тоже надо учитывать:
Код
Compare('-123','123');


И вообще, THandle указал направление, просто его развить надо, дополнить разными граничными условиями. Люди ведь не зря пишут целые библиотеки, посвященные работе с большими числами. Кстати, если погуглить - можно найти какие-нибудь исходники, посвященные этой теме.

Автор: XperT 22.11.2010, 14:43
THandle, 
Первое число может быть "001", а второе "99" и ваша функция даст не верный результат

Автор: Akella 22.11.2010, 15:20
Лучше переводить в число и сравнивать.

Автор: valerchi 22.11.2010, 15:47
Цитата(Akella @ 22.11.2010,  15:20)
Лучше переводить в число и сравнивать.

Всмысле, переводить в тип integer или вещественный? Но дело в том, что перевести не получается, - сильно числа большие (70 - 100 значные)

Автор: THandle 22.11.2010, 23:43
XperT, как сказал ama_kid это просто самый элементарный пример сравнения. Все конечно зависит от того что за числа, какая запись и тд.

Автор: Keeper89 22.11.2010, 23:55
valerchi, создай отдельный класс, и предусмотри проверки, так будет получше.

Автор: valerchi 23.11.2010, 09:03
Цитата(Keeper89 @ 22.11.2010,  23:55)
valerchi, создай отдельный класс, и предусмотри проверки, так будет получше.

Звучит как-то сложновато... А не проще сделать так, - создать ф-цию в которой каждый символ будет переводиться в тип integer (не всё число сразу, а по одному символу), и сравниваться?

Автор: aleksh 23.11.2010, 13:05
Цитата(valerchi @  23.11.2010,  09:03 Найти цитируемый пост)
создать ф-цию в которой каждый символ будет переводиться в тип integer

это какую
Код

j := strtoint(s[i])

что ли?

Автор: valerchi 23.11.2010, 17:33
Цитата(THandle @ 22.11.2010,  23:43)
XperT, как сказал ama_kid это просто самый элементарный пример сравнения. Все конечно зависит от того что за числа, какая запись и тд.

В принципе мне и это подходит. Результат точный. Ещё раз спасибо.

Автор: valerchi 24.11.2010, 00:10
Цитата(aleksh @ 23.11.2010,  13:05)
Цитата(valerchi @  23.11.2010,  09:03 Найти цитируемый пост)
создать ф-цию в которой каждый символ будет переводиться в тип integer

это какую
Код

j := strtoint(s[i])

что ли?

Если s - это строка, а i - номер символа, то вроде бы так.

Автор: aleksh 24.11.2010, 11:59
tovalerchi: вопросительный знак там шутки ради, просто продемонстрировал отсутствие необходимости создавать отдельную функцию

Автор: valerchi 24.11.2010, 13:46
Цитата(aleksh @ 24.11.2010,  11:59)
tovalerchi: вопросительный знак там шутки ради, просто продемонстрировал отсутствие необходимости создавать отдельную функцию

Почему?...  А взять два числа, а перевести каждый символ в отдельности в тип integer, а затем сравнить их, а заключить это всё в цикл, а минус перед числом учесть, а запятую? И т.д. и т.п. Вот это всё и нужно объединить в функцию.

Автор: THandle 24.11.2010, 18:28
Цитата(valerchi @  24.11.2010,  01:10 Найти цитируемый пост)

Если s - это строка, а i - номер символа, то вроде бы так. 


Что то мне подсказывает, что это будет работать довольно медленно...

Автор: aleksh 24.11.2010, 19:07
Цитата(THandle @  24.11.2010,  18:28 Найти цитируемый пост)

Что то мне подсказывает, что это будет работать довольно медленно... 

так зато не долго

Автор: Keeper89 24.11.2010, 21:50
Цитата(valerchi @  23.11.2010,  09:03 Найти цитируемый пост)
Звучит как-то сложновато...

Зато получится нормальная вещь, позволяющая не посылать каждое число в функцию, гибко обработать:
Цитата(valerchi @  24.11.2010,  13:46 Найти цитируемый пост)
а минус перед числом учесть, а запятую? И т.д. и т.п. Вот это всё и нужно объединить в функцию.

и много еще чего (10 запятых, 50 минусов, разные длины и т.д.), примеры ama_kid привел.

Автор: AntonN 24.11.2010, 22:24
глянь тут модель для длинной арифметики http://forum.sources.ru/index.php?showtopic=285453

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)