Числа, которые превышают основные типы в C # - PullRequest
4 голосов
/ 30 января 2009

Я решаю проблемы в Project Euler . Большинство проблем решено

  1. большие числа, превышающие ulong,
Ex : ulong number = 81237146123746237846293567465365862854736263874623654728568263582;
  1. очень чувствительные десятичные числа со значительными цифрами свыше 30

Пример: десятичный декабрь = 0,3242342543573894756936576474978265726385428569234753964340653;

  1. массивы, которые должны иметь значения индекса, превышающие наибольшее значение типа int.

Пример: bool [] items = new BOOL [213192471235494658346583465340673475263842864836]; * * 1 023

Я нашел библиотеку под названием IntX для решения этих больших чисел. Но мне интересно, как я могу решить эту проблему с базовыми типами .NET?

Спасибо за ответы!

Ответы [ 5 ]

8 голосов
/ 30 января 2009

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

Позвольте мне перефразировать это.

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

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

Могу ли я предложить вам другой язык программирования для задач Эйлера? Мне больше повезло с Python, так как он поддерживает большие числа из коробки и интегрирован во все остальное. Ну, за исключением этого массива, вы действительно не можете делать это ни на каком языке в наши дни.

4 голосов
/ 30 января 2009

Может быть, это может дать вам идеи о том, как решить часть вашей проблемы: http://www.codeproject.com/csharp/BigInteger.asp

В Википедии также есть хорошая статья о Математика с произвольной точностью , и в этой статье есть ссылка на Codeplex и W3b.sine , которая представляет собой библиотеку c # с произвольной точностью.

2 голосов
/ 30 января 2009

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

1 голос
/ 01 марта 2009

Большинство проблем решено

  1. большие числа, превышающие ulong,
  2. очень чувствительные десятичные числа со значащими цифрами более 30
  3. массивы, которые должны иметь значения индекса, превышающие наибольшее значение типа int.

Большинство проблем рассчитано на длину 64 бита. Есть один или два, которые требуют больших целых чисел, но не много. Ни один из тех, что я видел, не требует десятичных чисел с более чем 30 цифрами, и ни один не требует массивов, превышающих несколько тысяч записей.

Помните, что правильное решение проблем должно выполняться не более чем за несколько секунд, а заполнение массива из 213192471235494658346583465340673475263842864836 бит займет 10 ^ 30 лет.

0 голосов
/ 30 января 2009

Другим вариантом может быть использование типа BigInt, доступного в F #: http://cs.hubfs.net/forums/thread/887.aspx

...