Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как создать супертип??? И вообще, возможно ли это? 
:(
    Опции темы
Zero
  Дата 9.12.2004, 18:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2169
Регистрация: 23.10.2004
Где: Россия, г. Рязань

Репутация: нет
Всего: 24



Привет народ, вот мне в голову пришла идея, сделать свою задачу универсальной для ввода значений, т.е. чтобы вам было по понятнее, то скажу так, как сделать тип чтобы в него можно было записать большое кол-во символов?
Пример
Код

i:integer;  //Здесь можно ввести число с разрядностью до 16 бит
l:longint;  //а здесь до 32 бит
...
begin
i:=32767; //Здесь максимум можно записать только такое число
l:=2147483647;  //а тут такое.

Код

s:=99999999999999999999999999999999999999999...9; //А как записать типа такого???


Это сообщение отредактировал(а) Zero - 9.12.2004, 18:53
PM MAIL ICQ   Вверх
sergejzr
Дата 9.12.2004, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 4
Всего: 360



Массив из букв smile
Или создавай свой тип на N бит smile


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Zero
Дата 9.12.2004, 19:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2169
Регистрация: 23.10.2004
Где: Россия, г. Рязань

Репутация: нет
Всего: 24



Цитата(sergej @ 9.12.2004, 19:03)
Массив из букв

Это я не понял... а как он будет связан с типом Integer???
Цитата(sergej @ 9.12.2004, 19:03)
Или создавай свой тип на N бит

А это я сам пытался сделать, но не получается. smile
sergej.z, ты не мог бы пример привести???
PM MAIL ICQ   Вверх
sergejzr
Дата 9.12.2004, 19:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 4
Всего: 360



На паскале тяжеловато мне smile. Поищи, ведь есть уже готовые библиотеки для работы с длинными числами...

На Си это выглядело бы примерно так:

Код

class INumber
{
int * chislo;
int bitnumber;
INumber(int bit)
{
chislo=new int[bit/4];
bitnumber=bit;
}

INumber(const char* x)
{
 //считаешь, сколько бит понадобится
 // и делаешь init
}

void init(char* chislo)
{
//здесь разбиваешь строку на двоичное число и копируечь всё в твой массив из целых чисел
}
INumber operatot +(const INumber&n)
{
//здесь складываешь по битам
}
ofstream& operator>>(INumber &n)
{
 for(i=0;i<bitnumber;i++)
{
  //здесь переводишь свой массив обратно в строку и выдёшь на экран
}
}
};
....
int main()
{
INumber x("99999999999999999999999999999999999999999999999999999999");
INumber y("777777777777777777777777777777777777777777777777777777777777");
cout<<x+y;
}



--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
S.A.P.
Дата 9.12.2004, 19:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2664
Регистрация: 11.6.2004

Репутация: нет
Всего: 71



Могу на С++ сделать. На паскале вряд ли выйтет smile перегрузка операторов нужна.
Добавлено @ 19:35
sergej.z уже код написать успел smile
PM MAIL   Вверх
Zero
Дата 9.12.2004, 19:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2169
Регистрация: 23.10.2004
Где: Россия, г. Рязань

Репутация: нет
Всего: 24



Цитата(sergej @ 9.12.2004, 19:33)
На паскале тяжеловато мне

А я кроме Object Pascal, и ему подобных, не заню... (микроасемблер не в счёт)
PM MAIL ICQ   Вверх
Akina
Дата 9.12.2004, 19:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 20
Всего: 454



Самое компактное из тех что легко обрабатывать и в(ы)водить - Array of BCD.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
sergejzr
Дата 9.12.2004, 19:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 4
Всего: 360



На паскале можно было бы опередлить функции
add, subtract, multiply итд.


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Zero
Дата 9.12.2004, 19:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2169
Регистрация: 23.10.2004
Где: Россия, г. Рязань

Репутация: нет
Всего: 24



Цитата(Akina @ 9.12.2004, 19:37)
Самое компактное из тех что легко обрабатывать и в(ы)водить - Array of BCD
Что такое, BCD. И я впринципе сам вначале подумывал о массиве, но разве можно массиву присвоить число, и обрабатывать его? (типа разделить на чё-нибудь и т.п.)
Цитата(sergej @ 9.12.2004, 19:37)
На паскале можно было бы опередлить функции
add, subtract, multiply итд.
sergej.z, не мог бы ещё раз показать пример (но только связанный с паскалем)
PM MAIL ICQ   Вверх
sergejzr
Дата 9.12.2004, 19:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 4
Всего: 360



Я бы рад, но к сож. мне надо много восстанавливать в голове smile
Может кто нить сможет?


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
En_t_end
Дата 9.12.2004, 20:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2074
Регистрация: 4.12.2004

Репутация: нет
Всего: 20



sergej.z
Плюс в с++ можно создать динамический массив, где размер его элентов, будет ограничиваться лишь мощностью компьтера... -можно даже прогу сделать, чтобы юзверя её запускали, и мерились, чей комп круче...
PM MAIL ICQ Skype GTalk Jabber   Вверх
Akina
Дата 9.12.2004, 20:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 20
Всего: 454



Zero
Придется создавать процедуры присвоения, сравнения, сложения... т.е. просто пишешь свой класс. Если надо - потом перегружаешь существующие функции и операторы...


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
III.nfo
Дата 9.12.2004, 20:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 18.10.2004

Репутация: 2
Всего: 2



Можно число в файл кидать. Тогда число ограничено только размерами диска.
PM MAIL WWW   Вверх
Akina
Дата 9.12.2004, 20:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 20
Всего: 454



III.nfo
Вряд ли... А если диск на 120 Г? хотя... обрабатывать можно и по частям...


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Zero
Дата 9.12.2004, 20:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2169
Регистрация: 23.10.2004
Где: Россия, г. Рязань

Репутация: нет
Всего: 24



Цитата(Akina @ 9.12.2004, 20:27)
Zero
Придется создавать процедуры присвоения, сравнения, сложения... т.е. просто пишешь свой класс. Если надо - потом перегружаешь существующие функции и операторы...
Дело в том, что сейчас мне нужно сделать тип именно для паскаля, а не Lelphi, потом скажу причину, а сначала мне бы узнать как сделать такой тип.
Цитата(III @ 9.12.2004, 20:35)
Можно число в файл кидать. Тогда число ограничено только размерами диска.
Неа не пойдёт, тогда число нельзя будет преобразовывать, т.е. для преобразования его всёравно придётся кинуть в ОП, а для этого нужно сделать крутой тип.

PM MAIL ICQ   Вверх
sergejzr
Дата 9.12.2004, 20:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 4
Всего: 360



Цитата(Zero @ 9.12.2004, 19:43)
Неа не пойдёт, тогда число нельзя будет преобразовывать, т.е. для преобразования его всёравно придётся кинуть в ОП, а для этого нужно сделать крутой тип

Какие бы ты преобразования с число не делал, всё делается по частям smile
Правда, если весь Жд одним числом занять, то ни для второго, ни для результата их сложения места уже не останется smile


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Zero
Дата 10.12.2004, 00:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2169
Регистрация: 23.10.2004
Где: Россия, г. Рязань

Репутация: нет
Всего: 24



Ладно, скажу ещё так, чтобы вам понятнее было чё это за большое число, короче у меня в проге исп. цикл Фор, где это число и будет окончанием чикла, и если и поэтому с файлом тут работать никак нельзя...
Да и ещё при подсчёте в цикле это число будет ещё в одном месте исп. поэтому замена здесь ни как не пойдёт, чисто нужен алгоритм создания такого типа. smile
Недаром, я выложил эту тему в раздел алгоритмов, а не Delphi, Kulix and Pascal, где я в основном нахожусь. smile
PM MAIL ICQ   Вверх
Vit
Дата 10.12.2004, 00:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: нет
Всего: 207



У меня есть написанная мной библиотека которая работает с числами неограниченной разрядности, причём довольно быстро, например возведение 9999 в степень 9999 делается меньше чем за минуту (ответ с точностью до единицы).


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
Zero
Дата 10.12.2004, 00:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2169
Регистрация: 23.10.2004
Где: Россия, г. Рязань

Репутация: нет
Всего: 24



Цитата(Vit @ 10.12.2004, 00:30)
У меня есть написанная мной библиотека

Vit, а немог бы ты скинуть кусок кода, который связан с преобразованем типа, в неограниченую разрядность, интересно бы посмотреть суть алгоритма...
Цитата(Vit @ 10.12.2004, 00:30)
(ответ с точностью до единицы)

конечно в определённых случаях точность ни сильно на что-либо влияет, а в данном случае она может искозить весь результат, я надеюсь в твоём алгоритме точность не всегда искожается.
И кстати я был бы рад услышать мнение Дельфиста, что ты думаешь на счёт типов, можно ли его искуственно повысеть в разрядности??? Буду рад услышать любой ответ, бусть даже "нет", тогда буду знать что можно искать др. вариант. smile
PM MAIL ICQ   Вверх
En_t_end
  Дата 10.12.2004, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2074
Регистрация: 4.12.2004

Репутация: нет
Всего: 20



"массиву присвоить число, и обрабатывать его? (типа разделить на чё-нибудь и т.п.)"
Конечно, просто представляй, что число в массиве разбито на разряды, ДЫк первый(matr[0]) - это допустим десятки в случае (matr[] = { 1, 0}) А пользователь будет думать, что это действительно очень большое число, а для компьютера, это будет всего лишь набор цифр... НО с ними можно работать, точнее производить арифметические операции(+, -, /, smile, НО всё это можно будет делать, лишь в случае представления набора числе в массиве, как разрядов нужного числа...
Ну если будешь пользоваться данным методом не забывай, простые свойства массивов : matr[6] = { 1,0,0,0,0} - это число 10000 к примеру : если число в массиве - нуль, так тут вообще всё просто...
Чтобы узнать максимальный разряд числа в массиве, то нужно просто подсчитать кол-во элементов в нём, соответсвенно всё зависит от языка разработки...
А если надо будет постоянно производить изменение числа, то надо юзать дин. массив.

Это сообщение отредактировал(а) En_t_end - 10.12.2004, 12:08
PM MAIL ICQ Skype GTalk Jabber   Вверх
Zero
Дата 10.12.2004, 17:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2169
Регистрация: 23.10.2004
Где: Россия, г. Рязань

Репутация: нет
Всего: 24



А как на счёт того, что я собираюсь использвать такой цикл:
Код

var
 i,m,sum:<Здоровый тип>
...
for i:=1 to m do
sum:=sum+i;
...
Как его свяжете с массивом???

Это сообщение отредактировал(а) Zero - 10.12.2004, 17:06
PM MAIL ICQ   Вверх
Akina
Дата 10.12.2004, 17:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 20
Всего: 454



Цитата(Zero @ 10.12.2004, 18:05)
Как его свяжете с массивом???

Главное, чтобы для него был переопределен оператор сложения. А массив он там или нет - пусть метод класса разбирается - он-то знает... а для программы это целое число - просто какое-то ненормально длинное...


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
III.nfo
Дата 10.12.2004, 20:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 18.10.2004

Репутация: 2
Всего: 2



Цитата
Неа не пойдёт, тогда число нельзя будет преобразовывать, т.е. для преобразования его всёравно придётся кинуть в ОП, а для этого нужно сделать крутой тип.

А нельзя ли кусками обрабатывать?
Т.Е. обработал кусок - пишешь его куда-нибудь, едем далее...
Тем более, сомневаюсь, что число будет более 1 МБ по длине

Цитата
Вряд ли... А если диск на 120 Г? хотя... обрабатывать можно и по частям...

Так вопрос был про оч-чень большое число.
PM MAIL WWW   Вверх
Zero
  Дата 10.12.2004, 22:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2169
Регистрация: 23.10.2004
Где: Россия, г. Рязань

Репутация: нет
Всего: 24



Цитата(III @ 10.12.2004, 20:58)
А нельзя ли кусками обрабатывать?
Т.Е. обработал кусок - пишешь его куда-нибудь, едем далее...

Кусками, конечно можно, и я даже могу переделать др. способом, но это уже будет нето, ведь у меня учебная прога, и я хочу разобратся в том как сделать такой тип, чтобы он мог бы включать кучю разрядов. Если бы у меня было задание "сделать так, неважно как", то я бы сделал что-нибудь, вчасности если бы на практике делал, то там только можно исп. так...
Цитата(Akina @ 10.12.2004, 17:23)
Главное, чтобы для него был переопределен оператор сложения. А массив он там или нет - пусть метод класса разбирается - он-то знает... а для программы это целое число - просто какое-то ненормально длинное...

Akina, а ты всётаки знаеш как сделать то что я просил или нет???

И ещё, интересно:
Цитата(Vit @ 10.12.2004, 00:30)
У меня есть написанная мной библиотека которая работает с числами неограниченной разрядности
Vit хотел похвалится своей библиотекой, или поделится??? smile
PM MAIL ICQ   Вверх
neutrino
Дата 11.12.2004, 00:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Gothic soul
****


Профиль
Группа: Модератор
Сообщений: 3041
Регистрация: 25.3.2002
Где: Верхняя Галилея, Кармиэль

Репутация: нет
Всего: 62



Зачем перегружать операторы? Можно ведь просто написать функции сложения, умножения .. ит.д. (то, что Вит предлагал.). Важно лишь в каком формате Вит представил числа.

Тут говорили на счет компактности... Так на самом деле компактнее всего хранить числа в формате PACKED BCD (упакованный двоично-десятичный). Кстати и операции для такого типа довольно быстры, нежели для простого массива разрядов. Правда это дело придется писать на ассемблере. Проще всего узнать у Вита о его числах.
Добавлено @ 00:49
Если надо я написал функции ADD, SUBTRACT, MULTIPLY на ассемблере. Работают довольно быстро, но с массивом разрядов, по-моему (уже не помню smile ).


--------------------
The truth comes from within ...

Покойся с миром, Vit 
PM MAIL WWW ICQ Skype GTalk   Вверх
En_t_end
Дата 11.12.2004, 07:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2074
Регистрация: 4.12.2004

Репутация: нет
Всего: 20



ТОЧНО, как же я сразу не догадался... ведь надо переводить обычное десятичное число в двоичное, но если оно слишком велико, то разбиваем его соответсвенно правилу разрядов... дальше делаем с ним ар. операции, через ассемблерные вставки... переводим число обратно в десят. формат, но если оно большее разбиваем его на разряды и т.д и т.п... Так можно работать с просто-офигенно большими числами...
PM MAIL ICQ Skype GTalk Jabber   Вверх
Fedor
Дата 11.12.2004, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Днепрянин
****


Профиль
Группа: Участник
Сообщений: 2090
Регистрация: 8.2.2003
Где: Великий

Репутация: 2
Всего: 32



Zero зайди на algolist.manual.ru там есть статья по работе с длинными числами. Описан алгоритм сложения, вычитания, деления и умножения. Попробуй еще в инете поискать книгу или статьи Окулова. Там ве хорошо это расписано


--------------------
Мы - Днепряне. Мы всех сильней.
PM ICQ   Вверх
Zero
Дата 12.12.2004, 11:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2169
Регистрация: 23.10.2004
Где: Россия, г. Рязань

Репутация: нет
Всего: 24



Ладно, народ спасибо всем за участие, впринцепе на свой вопрос я ответ получил, т.е. я так и думал что через раздел Type, его не сделать, а на всякий случай спросил у вас, но раз непосредственного способа я не получил значит действительно сделать его так нельзя...smile
Ещё раз, Спаисбо всем за участие и ответы!!!
Добавлено @ 11:49
Цитата(neutrino @ 11.12.2004, 00:42)
Если надо я написал функции ADD, SUBTRACT, MULTIPLY на ассемблере. Работают довольно быстро, но с массивом разрядов, по-моему (уже не помню  smile ).

neutrino, тебе тоже спасибо за попытку оказать ещё одну помощь, но я в асемблере не умею программировать... smile
PM MAIL ICQ   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.0808 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.