Страницы

Поиск по вопросам

понедельник, 9 декабря 2019 г.

Как посчитать факториал большого числа? [дубликат]

#алгоритм


        
             
                
                    
                        
                            This question already has answers here:
                            
                        
                    
                
                        
                            Работа с длинными числами
                                
                                    (5 ответов)
                                
                        
                                Closed 1 год назад.
            
                    
Как посчитать факториал большого числа в случае, когда размерности типа не хватает?
Например, 50! или 100!. Какими методами это можно обойти?    


Ответы

Ответ 1



Java- BigInteger Python- Длинные числа C++ - BigInteger PHP- BCMath

Ответ 2



Как вариант, можно использовать длинную арифметику (т.е. мы наше число-результат храним не в каком-то типе long или int, а просто, например, его цифры в десятичной записи в качестве ячеек некоторого массива, который представляет число). О реализации такого метода можно почитать тут: Длинная арифметика Длинная арифметика реализована на Java в классе BigInteger в пакете Math (если не ошибаюсь). В других языках она тоже есть, как ответил @ReinRaus Другой вариант - считать ответ по модулю (т.е. выдать остаток от деления факториала на некоторое число). Тогда, каждый раз домножая на определённое число при подсчёте факториала нужно пользоваться формулой. Так мы не допустим переполнение типа. Если нужно выдать только, например, 8 последних цифр факториала, то можно искать остаток от деления на 10^8.

Ответ 3



На питоне это очень просто: Python 3.4.1 (v3.4.1:c0e311e010fc, May 18 2014, 10:38:22) [MSC v.1600 32 bit (Intel)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> def f(n): ... return n * f(n - 1) if n > 1 else 1 ... >>> f(5) 120 >>> f(0) 1 >>> f(50) 30414093201713378043612608166064768844377641568960512000000000000 >>> f(100) 93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920 827223758251185210916864000000000000000000000000 >>> f(500) 1220136825991110068701238785423046926253574342803192842192413588385845373153881997605496447502203281863013616477148203584163378722078177200480785205159329285477907571939330603772960859086270429174547882424912726344305670173270769461062802310452644218878789465754777149863494367781037644274033827365397471386477878495438489595537537990423241061271326984327745715546309977202781014561081188373709531016356324432987029563896628911658974769572087926928871281780070265174507768410719624390394322536422605234945850129918571501248706961568141625359056693423813008856249246891564126775654481886506593847951775360894005745238940335798476363944905313062323749066445048824665075946735862074637925184200459369692981022263971952597190945217823331756934581508552332820762820023402626907898342451712006207714640979456116127629145951237229913340169552363850942885592018727433795173014586357570828355780158735432768888680120399882384702151467605445407663535984174430480128938313896881639487469658817504506926365338175055478128640000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

Ответ 4



Вот тута есть ответ Когда поступал на работу выдали тестовле задание, вот как я его сделал: Java package com.pack.fac; import java.math.BigInteger; public class Factorial { public static BigInteger problem20(int max){ //amount of received items BigInteger sum = BigInteger.valueOf(0); //result BigInteger result = BigInteger.valueOf(1); for(long i = 1; i<=max; i++){ result = result.multiply(BigInteger.valueOf(i)); } while (!result.equals(0)) { sum = sum.add(result.mod(BigInteger.valueOf(10))); result = result.divide(BigInteger.valueOf(10)); System.out.println(sum + " "+ result); } return sum; } public static void main(String[] args) { problem20(100); //число из которого нужно взять факториал } }

Комментариев нет:

Отправить комментарий