2013-04-04 3 views
1

Я занимаюсь компьютерной инженерией, и у нас есть трудная задача.Факториальный алгоритм, который не использует библиотеку Big-Integer

Мы должны разработать приложение C#, которое может вычислять факториалы действительно больших чисел без BIGINT. Я имею в виду действительно большие цифры, например 123564891 ... 82598413!. И нам не нужно использовать разрешение для использования пользовательских библиотек (например, BIGINT).

Исследовал его и нашел несколько вопросов, как это, но этот вопрос иначе, чем другие, потому что мы должны вычислить действительно большие номера без каких-либо пользовательских библиотек. Я нашел PoorMans Algorithm. Но он вычисляет до 10000. Этого недостаточно для нас.

С моими товарищами по команде мы нашли решение. Допустим, мы получим факториал 123. Мы получим 123 как String. И тогда мы будем суммировать 123, 122 раза (это равно 123 х 122). А затем суммируйте результат 121 раз. Это будет так, пока не достигнет 1. Итак, мы суммируем две строки.

Создаем алгоритм суммирования строк. Мы получаем последний символ первого числа (3 из 123) как целое число (мы можем использовать целое число, но не bigint). И получите последний символ второго числа как целое (2 из 122). Суммируйте их и найдите последний символ последнего результата (result = x ... x5). Мы сделаем это от последнего символа до первого символа. Наконец, мы получим номер результата . Но, как вы знаете, мы должны использовать цикл while() или for(), и для использования этого цикла нам нужен bigint снова.

String number = "9878945647978979798798797189"; //we will get factorial of this 
for(int i = 0;i < number.Length; i++) 
{ 
    // sum all chars one by one 
} 

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

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

Это вопрос программиста, а не вопрос Math.stackexchange.com, потому что мне нужны программные ответы и пошаговые руководства напрямую. Если я задам этот вопрос на сайте Math, они дадут мне этот список: http://www.luschny.de/math/factorial/FastFactorialFunctions.htm. Вероятно, они не поймут мою проблему BIGINT '.

+14

Я думаю, что упражнение просит вас написать свою собственную библиотеку bigint. –

+0

Вы понимаете, что количество цифр растет очень быстро, вы даже не сможете хранить все цифры вашего номера в примере. И это займет очень много времени. – Andrey

+0

@ Андрей, точно! вот в чем проблема :) Из-за этого наше приложение будет содержать таймер, и мы покажем пользователю, сколько секунд потребовалось. Также, например, мы сохраним результат 123! и когда пользователь спрашивает 124! мы будем использовать непосредственно 124 * 123! , – Eray

ответ

4

Вам нужно будет написать собственную библиотеку большого числа. Проверьте Knuth Volume 2, чтобы начать.

Ваши ожидания выглядят немного ... чрезмерно восторженными. Вы будете не сможете вычислить факториал 9878945647978979798798797189 независимо от того, что вы делаете.

+0

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