2008-11-10 2 views
21

Я пытаюсь решить проблемы на projecteuler.net, но я продолжаю сталкиваться с несколькими проблемами., работающий с невероятно большими номерами в .NET.

Первый вопрос заключается в хранении больших количеств элементов в List<t>. Я сохраняю OutOfMemoryException при хранении больших количеств в списке.

Теперь я признаю, что, возможно, я не делаю эти вещи наилучшим образом, но есть ли способ определить, сколько памяти может потреблять приложение?

Это, как правило, падает, когда я получаю Abour 100000000 элементы: S

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

У вас есть советы по работе с невероятно большими номерами?

+8

В .NET 4.0 System.Numerics.BigInteger имеет дело с большими числами. – Brian 2010-11-27 20:13:49

ответ

26

Чтобы разделить эти операции, вам нужно использовать класс большого класса, который использует некоторые основные принципы математики. Этот implementation of a C# BigInteger library на CodePoject кажется наиболее перспективным. В статье есть несколько хороших объяснений того, как работают операции с массивными числами.

Также см: Big integers in C#

+4

Почему он отказался? O.o – TraumaPony 2008-11-19 03:14:06

1

Смотрите ответы в этой thread. Вероятно, вам нужно использовать одну из сторонних больших целочисленных библиотек/классов или ждать C# 4.0, которая будет включать собственный тип данных BigInteger.

+0

+1 для использования окна поиска (которое ПП не выполнял?). – jcollum 2009-01-16 17:08:27

3

Я предполагаю, что это C#? F # построил способы решения обеих этих проблем (тип BigInt и ленивые последовательности).

Вы можете использовать обе технологии F # из C#, если хотите. Тип BigInt можно использовать с других языков, если добавить ссылку на сборку ядра F #.

Ленивые последовательности в основном просто дружественные к синтаксису счетчикам. Внесение 100 000 000 элементов в список не является отличным планом, поэтому вы должны пересмотреть свои решения, чтобы обойти это. Если вам не нужно хранить информацию, выбросьте ее! Если дешевле пересчитать его, чем хранить, выбросьте его!

9

Что касается Project Euler, вы можете лаять неправильное дерево, если вы используете исключения OutOfMemory. На своем веб-сайте:

Каждая проблема была разработана в соответствии с «правилом в одну минуту», что означает, что, хотя для разработки успешного алгоритма с более сложными проблемами может потребоваться несколько часов, эффективная реализация позволит решение, которое будет получено на компьютере с умеренным питанием менее чем за одну минуту.

+0

Надеюсь, он уже понял это. – ine 2008-11-10 20:40:30

+0

lol, да. Я не мега математик. Хотя я надеюсь научиться чему-то – 2008-11-10 20:51:54

+0

, вы можете получить довольно неплохую теорию чисел и теорию множеств. Прочитайте предварительный тест Миллера Рабина для многих проблем с простым номером. – 2008-11-10 20:59:44

1

Что касается определения объема памяти приложения, вы можете проверить доступную память перед выполнением операции, используя класс MemoryFailPoint.

Это позволяет предварительно распределять память перед выполнением операции, поэтому вы можете проверить, не завершится ли операция до ее запуска.

4

Как сказал Jakers, если вы используете Big Numbers, возможно, вы делаете это неправильно.

Из проблем ProjectEuler, которые я сделал, до сих пор ни одна из них не требовала математики большого числа. Его больше о поиске правильного алгоритма, чтобы избежать больших чисел.

Хотите намеков? Сообщение здесь, и у нас может быть интересная нить Эйлера.

1

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

class Solution 
{ 

    static void Main(String[] args) 
    { 
     int n = 5; 
     string[] unsorted = new string[6] { "3141592653589793238","1", "3", "5737362592653589793238", "3", "5" }; 

     string[] result = SortStrings(n, unsorted); 

     foreach (string s in result) 
      Console.WriteLine(s); 
     Console.ReadLine(); 
    } 
    static string[] SortStrings(int size, string[] arr) 
    { 

     Array.Sort(arr, (left, right) => 
     { 

      if (left.Length != right.Length) 
       return left.Length - right.Length; 
      return left.CompareTo(right); 
     }); 

     return arr; 
    } 
} 
Смежные вопросы