Какую структуру данных я должен использовать для создания моего собственного класса “BigInteger”?

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

Это будет для произвольно чисел длинного целого, даже сотни цифр долго.

При выполнении математики на этих числах цифра цифрой не тверда, что Вы думаете, что лучший datastructure должен был бы представить мой "BigInteger"?

Сначала я рассматривал использование Массива, но затем я думал, что мог все еще потенциально переполниться (исчерпанный ячейки массива) после того, как большое добавляет или умножение. Это было бы хорошим случаем для использования связанного списка, так как я могу лавировать на цифрах с O (1) временная сложность?

Есть ли некоторая другая структура данных, которая еще лучше подошла бы, чем связанный список? Должен тип, который моя структура данных содержит быть самым маленьким целым типом, который я имею в наличии для меня?

Кроме того, я должен быть осторожен относительно того, как я храню свою переменную "переноса"? Должен это, само, иметь мой тип "BigInteger"?

13
задан Bill the Lizard 17 September 2012 в 13:15
поделиться

10 ответов

Прочтите книгу Интерфейсы и реализации C Дэвида Р. Хэнсона. В нем 2 главы по теме, охватывающие векторную структуру, размер слова и многие другие проблемы, с которыми вы, вероятно, столкнетесь.

Он написан для C, но большая часть применима к C ++ и / или Java. А если вы используете C ++, это будет немного проще, потому что вы можете использовать что-то вроде std :: vector для управления распределением массива за вас.

3
ответ дан 2 December 2019 в 01:49
поделиться

Ознакомьтесь с книгой C Interfaces and Implementations Дэвида Р. Хэнсона. В нем есть 2 главы по теме, охватывающие векторную структуру, размер слов и многие другие проблемы, с которыми вы, вероятно, столкнетесь.

Он написан для языка C, но большая его часть применима к C++ и/или Java. А если вы используете C++ это будет немного проще, потому что вы можете использовать что-то вроде std:: vector для управления выделением массива для вас.

-121--2861362-

Обработка события click в документе, а затем обработка события click в li . В событии click для li используйте функцию stopPropogation , чтобы предотвратить запуск события click документа (родительского)...

$(document).click(function() {
  // Clicked outside the LI
});

$('#search_suggestions_list li').click(function(e) {
  var selectedString = $(this).text(); 
  $('#search-box').val(selectedString); 
  setTimeout("$('#search_suggestions').fadeOut('fast');", 200);

  e.stopPropagation(); // Stops document.click from firing
}) 
-121--4268430-

Если вы используете двоичные деревья (листья которых представляют собой инты), вы получаете все преимущества связанного списка (неограниченное количество цифр и т.д.) с более простыми алгоритмами разделения и завоевания. В этом случае у вас нет одной базы, но много в зависимости от уровня, на котором вы работаете.

Если вы делаете это, вам нужно использовать BigInteger для переноски. Вы можете считать преимуществом подхода «связанного списка int», что перенос всегда может быть представлен как int (и это верно для любой базы, а не только для базы 10, поскольку большинство ответов, кажется, предполагает, что вы должны использовать... В любом основании, переноска всегда одна цифра)

Я мог бы также сказать: это было бы ужасной тратой, чтобы использовать базу 10, когда вы можете использовать 2 ^ 30 или 2 ^ 31.

1
ответ дан 2 December 2019 в 01:49
поделиться

Всегда используйте наименьший тип int, который будет выполнять нужную вам работу (байты). Связанный список должен работать хорошо, так как вам не придется беспокоиться о переполнении.

1
ответ дан 2 December 2019 в 01:49
поделиться

Медленный доступ к элементам связанных списков. Я думаю, что массивы - это то, что нужно, с большим количеством проверок привязки и изменением размера массива при необходимости.


Пояснение : Обход связанного списка и обход массива - это операции O ( n ). Но для обхода связанного списка требуется обращение к указателю на каждом шаге. Тот факт, что два алгоритма имеют одинаковую сложность, не означает, что для их выполнения требуется одинаковое время. Накладные расходы на выделение и освобождение n узлов в связанном списке также будут намного тяжелее, чем управление памятью для одного массива размером n , даже если размер массива необходимо изменить на несколько раз.

1
ответ дан 2 December 2019 в 01:49
поделиться

Написание драйвера устройства может быть довольно простым или практически произвольно сложным. Например, я участвовал в проекте, где нам понадобилось шесть из нас почти три года, чтобы решить ОДНУ ошибку в драйвере устройства. Конечно, мы вычистили десятки других ошибок, пока искали их... код значительно улучшился. Исправление оказалось восьмистрочным патчем, стоившим, консервативно, около миллиона долларов.

Но, как побочный проект, я написал драйвер Ethernet из опросного листа чипа за неделю, и заняла еще неделю, чтобы его отладить. С тех пор не нужно было трогать.

Нет пути сказать в целом, сколько будет работать водитель; драйвер GPU может стоить сотни миллионов, драйвер на один светодиод стоит максимум пару часов работы.

-121--954596-

Из MSDN

Если Internet Explorer знает указанный тип содержимого и отсутствуют данные о расположении содержимого, Internet Explorer выполняет «поиск MIME», сканируя первые 200 байт файла, чтобы определить, соответствует ли структура файла любым известным типам MIME. Дополнительные сведения о проверке MIME см. в разделе Обнаружение типов MIME в Internet Explorer. Если MIME-запрос обнаруживает тип MIME, известный Internet Explorer, и файл не был загружен мимефильтром, Internet Explorer задает расширение файла перед помещением файла в локальный кэш браузера.

Наконец, если нет данных Content-Type или Content-Disposition, и MIME sniff не распознает известный тип MIME, расширение файла набора к тому же расширению, что и URL, используемый для загрузки файла.

Если файл помечен в заголовке HTTP как «content-disposition = attachment», Internet Explorer обрабатывает имя файла из URL как окончательное и не переименовывает его перед помещением в кэш.

content-disposition = attachment - решение?!?

/Эрлинг Дамсгаард ApS DNS-IT

-121--4859699-

Вау, есть некоторые... интересные ответы здесь. Я бы рекомендовал читать книгу, а не пытаться разобрать все эти противоречивые советы.

При этом C/C + + также плохо подходит для этой задачи. Большое целое число - своего рода математика расширенной точности. Большинство центральных процессоров предоставляет инструкции обращаться с математикой расширенной точности в сопоставимом или той же скорости (биты за инструкцию) как нормальная математика. Когда вы добавляете 2^32+2^32, ответ 0... но также имеется специальный выходной сигнал переноса из ALU процессора, который программа может считывать и использовать.

C++ не может получить доступ к этому флагу, и в C тоже нет пути. Вы должны использовать ассемблер.

Чтобы удовлетворить любопытство, можно использовать стандартную логическую арифметику для восстановления битов переноса и т.д. Но вам будет гораздо лучше загрузить существующую библиотеку.

1
ответ дан 2 December 2019 в 01:49
поделиться

Я бы сказал массив целых чисел.

0
ответ дан 2 December 2019 в 01:49
поделиться

Массив действительно подходит. Я думаю, что допустимо бросать OverflowException, когда вам не хватает места в вашей памяти. Учитель заметит внимание к деталям.

Умножение примерно удваивает числа, сложение увеличивает его максимум на 1. Легко создать достаточно большой массив для хранения результата вашей операции.

Перенос - это не более чем однозначное длинное число при умножении (9 * 9 = 1, перенос 8). Подойдет один int.

0
ответ дан 2 December 2019 в 01:49
поделиться

std :: vector или std :: vector , вероятно, то, что вам нужно. Вам нужно будет использовать для них push_back () или resize () , так как вам нужно больше места для умножения и т. Д. Также не забудьте push_back правильных битов знака, если вы используете два -комплимент.

0
ответ дан 2 December 2019 в 01:49
поделиться

Я бы сказал, что std :: vector типа char (поскольку он должен содержать только 0-9) (если вы планируете работать в BCD)

Если не BCD, используйте вектор типа int (вы не ясно дали понять )

Намного меньше накладных расходов на этот список ссылок

И все советы говорят «используйте вектор, если у вас нет веской причины»

0
ответ дан 2 December 2019 в 01:49
поделиться

Как правило, используйте std :: vector вместо std :: list , если вам не нужно очень часто вставлять элементы в середине последовательности. Векторы, как правило, работают быстрее, поскольку они хранятся непрерывно и, таким образом, выигрывают от лучшей пространственной локализации (основной фактор производительности на современных платформах).

Убедитесь, что вы используете элементы, естественные для платформы. Если вы хотите быть независимым от платформы, используйте long . Помните, что если у вас нет специальных встроенных функций компилятора, вам понадобится тип как минимум в два раза больше для выполнения умножения.

Я не понимаю, почему вы хотите, чтобы кэрри было большим целым числом. Перенос - это один бит для сложения и размер элемента для умножения.

Обязательно прочтите книгу Кнута «Искусство компьютерного программирования», там подробно описаны алгоритмы, относящиеся к арифметике произвольной точности.

0
ответ дан 2 December 2019 в 01:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: