При расчете факториалов, превышающих 20 или более, значение результата факториалов имеет тенденцию быть очень большим. Факторный результат очень небольшого числа может превышать диапазон целых чисел в текущем персональном компьютере. Если вам нужен большой фактор, например, более 1000 нельзя решить простым рекурсием. В Интернете я видел много алгоритмов о больших целочисленных факториалах, написанных в C, C ++ и C#, включая множество классических, но также и много грубых статей. Массив пересекает границу, и вы можете сразу увидеть, что сама программа не может работать. Перепечатав статей других людей, внимательно посмотрите на код. Увы, грубо. Это китайский Новый год, я чувствую себя таким усталым дома. Я тщательно проанализировал и использовал Java для реализации программы для расчета сверхуровного целочисленного фактора. Идея взята из Интернета и лично оптимизируется и улучшается.
Этот метод использует алгоритм «переноска массива». При превышении диапазона значений компьютерных переменных, многозначное умножение преобразуется в однозначное умножение. Например, 11! = 39916800. Если вам нужен фактор 12, вам нужно умножить 39916800 и 12, и вы можете использовать скорость распределения умножения. Вертикальная формула умножения показана на рисунке ниже:
Используйте массив, чтобы сохранить результат каждого фактора, и элемент массива, чтобы сохранить однозначный номер. Например: 399 фактического результата 11
16800 сохраняется до 8 элементов массива. Чтобы рассчитать фактор 12, умножьте значение в каждом элементе массива на 12 и сохраните результат в исходном элементе массива. Затем мы определим, должен ли каждый элемент массива носить. Благодаря операциям переноски число, сохраненное каждым элементом в массиве, составляет только однозначный. Схематическая схема заключается в следующем:
Теоретически, если допускается пространство памяти компьютера, факторный результат может быть сохранен, больше не ограничивается диапазоном переменных, но ограничен только способностью адресации операционной системы и памятью компьютера. Дружественные советы: если требуемый факторный номер большой, вы можете определить массив как длинный тип, чтобы избежать переполнения при расчете продукта номера единицы.
Код реализации выглядит следующим образом:
открытый класс BigInteger {/*** Рассчитайте перенос* @param бит массив* @param pos, используемый для определения того, является ли это высоким битом массива*/private void carry (int [] bit, int pos) {int i, carray = 0; для (i = 0; i <= pos; i ++). <= 9) // Нет переноса, если меньше 9 {carray = 0;} else if (bit [i]> 9 && i <pos) // больше 9, но не самый высокий бит {carray = bit [i]/10; // Сохранить бит переноса [i] = bit [i]%10; // Получить единственную цифру этого бита} reles bit {while (bit [i]> 9) // rup forward bit {carray = bit [i]/10; // Рассчитывать бит значения переноса [i] = bit [i] % 10; // текущая первая цифра i ++; bit [i] = carray; // Сохранить значение переноса в следующем бите}}}}/** ** ** Fartiger factorial* @param bigiteger writerger integer integer*}}}/** ** void BigFactorial (int BigInteger) {int pos = 0; // int Digit; // Длина данных int a, b; int m = 0; // Статистические цифры int n = 0; // Статистические выходы + 1; // Длина данных int [] fact = new int [Digit]; // Инициализировать факт массива [0] = 1; // Предположим, что однозначная цифра составляет 1FOR (a = 2; a <= bigInteger; a ++) // Умножение 2^BigInteger с оригинальным продуктом One на один {for (b = digit-1; b> = 0; b-) // Найти высокий продукт {fact {b = b> = 0; b-) //////in digiT {b = b> = 0; b-)/////if witd {b = digit-1; b> = 0; 0) {pos = b; // Записывает самый высокий разрыв битов;}} для (b = 0; b <= pos; b ++) {fact [b] *= a; // каждый бит умножается на i} carry (fact, pos);} для (b = digit-1; b> = 0; b-) {if [b] = 0) {pos = b;//0; Break;}} System.out.println (bigInteger+"Заводской результат:"); для (a = pos; a> = 0; a -) // Результат выхода вывода {system.out.print (fact [a]); m ++; if (m % 5 == 0) {system.out.print (""); if (40 == m) {System.out.print ("); if (40 == m) {System.out.print ("); ; n ++; if (10 == n) {System.out.print ("/n"); n = 0;}}} system.out.println ("/n"+"фактические факторы:"+(pos+1)+"bits");} public void dobigcquectorial (int biginteger) {int timebege = (int) systemlimillis. this.bigfactorial (biginteger); int timefinishi = (int) system.currenttimemillis (); int time = timefinishi-timebegin; system.out.println («Время расчета:" + time + "msec");} public void main (string [] args) {biginteger bi = new biginteger ();Рассчитайте фактор 10 000 и отобразите следующее:
В результате консоль, очевидно, не может сохранить контент. Существует 450 000 факториалов 100 000, что эквивалентно роману с 450 000 слов. Факторные результаты 1000 заключаются в следующем:
Консоль может быть отображена полностью.
Суммировать
Выше приведено все содержание этой статьи о подробном объяснении Java версии супер -большого целочисленного факториального кода алгоритма - уровня 10000. Я надеюсь, что это будет полезно для всех. Заинтересованные друзья могут продолжать ссылаться на этот сайт:
" Анализ Кодекса индекса мощности операции на Java "
« Пример реализации программирования Java для эксклюзивного или эксклюзивного или операции шестнадцатеричных строк »
« Java Programming реализует пользовательские совместную фильтрацию Рекомендуемое пример кода алгоритма »
Если есть какие -либо недостатки, пожалуйста, оставьте сообщение, чтобы указать это. Спасибо, друзья, за вашу поддержку на этом сайте!