Как я могу вычислить факториал в C# с помощью вызова библиотеки?

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

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

Позволяют нам стать немного более конкретными. Рассмотрите обычные способы хранить данные в памяти: обычно они могут быть сведены к любой непрерывные расширяемые массивы / списки, pointer/reference-based графики, и двоичные блобы данных в особенности форматируют.

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

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

Это - всего одна идея. Другие места для поиска идей находятся в общих проектах файловой системы или реляционной базе данных физические стратегии хранения.

, Конечно, в зависимости от Ваших требований, это может быть излишеством. Можно просто быть после двоичного формата для сохранения данных в оперативной памяти, в этом случае подход для рассмотрения отмечен записи.

В этом подходе, каждая часть данных снабжается префиксом тег. Тег указывает на тип сразу после данных, и возможно его длины и имени. Списки могут быть снабжены суффиксом тег "списка конца", который не имеет никакой полезной нагрузки. Тег может иметь встроенный идентификатор, таким образом, теги, которые не поняты, могут быть проигнорированы механизмом сериализации, когда это читает вещи в. Это немного похоже на XML в этом отношении, кроме использования двоичных идиом вместо этого.

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

6
задан Community 23 May 2017 в 12:00
поделиться

3 ответа

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

7
ответ дан 8 December 2019 в 18:38
поделиться

На аналогичную тему уже был предыдущий вопрос . Кто-то там связал веб-сайт Fast Factorial Functions , который включает некоторые объяснения эффективных алгоритмов и даже исходный код C #.

4
ответ дан 8 December 2019 в 18:38
поделиться

Do you want to calculate factorials, or binomial coefficients?

It sounds like you want to calculate binomial coefficients - especially as you mention 11!/(7!3!).

There may be a library that can do this for you, but as a (presumably) programmer visiting stack overflow there's no reason not to write one yourself. It's not too complicated.

To avoid memory overflow, don't evaluate the result until all common factors are removed.

This algorithm still needs to be improved, but you have the basis for a good algorithm here. The denominator values need to be split into their prime factors for the best result. As it stands, this will run for n = 50 quite quickly.

float CalculateBinomial(int n, int k)
{
    var numerator = new List<int>();
    var denominator = new List<int>();
    var denominatorOld = new List<int>();

    // again ignore the k! common terms
    for (int i = k + 1; i <= n; i++)
        numerator.Add(i);

    for (int i = 1; i <= (n - k); i++)
    {
        denominator.AddRange(SplitIntoPrimeFactors(i));
    }

    // remove all common factors
    int remainder;                
    for (int i = 0; i < numerator.Count(); i++)
    {
        for (int j = 0; j < denominator.Count() 
            && numerator[i] >= denominator[j]; j++)
        {
            if (denominator[j] > 1)
            {
                int result = Math.DivRem(numerator[i], denominator[j], out remainder);
                if (remainder == 0)
                {
                    numerator[i] = result;
                    denominator[j] = 1;
                }
            }
        }
    }

    float denominatorResult = 1;
    float numeratorResult = 1;

    denominator.RemoveAll(x => x == 1);
    numerator.RemoveAll(x => x == 1);

    denominator.ForEach(d => denominatorResult = denominatorResult * d);
    numerator.ForEach(num => numeratorResult = numeratorResult * num);

    return numeratorResult / denominatorResult;
}

static List<int> Primes = new List<int>() { 2, 3, 5, 7, 11, 13, 17, 19, 
    23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97 };

List<int> SplitIntoPrimeFactors(int x)
{
    var results = new List<int>();
    int remainder = 0;

    int i = 0;
    while (!Primes.Contains(x) && x != 1)
    {
        int result = Math.DivRem(x, Primes[i], out remainder);
        if (remainder == 0)
        {
            results.Add(Primes[i]);
            x = result;
            i = 0;
        }
        else
        {
            i++;
        }
    }
    results.Add(x);
    return results;
}

I can estimate n = 110, k = 50 (returns 6x10^31) but cannot run n = 120, k = 50.

3
ответ дан 8 December 2019 в 18:38
поделиться
Другие вопросы по тегам:

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