Programação com números inteiros gigantes

Quanto é o fatorial de 5? 120, fácil, não? E quanto é o fatorial de 6000? É um número com 20 mil dígitos. És capaz de escrever um programa que calcule isto? Depois de ler este artigo, você será!

[ Hits: 203.511 ]

Por: Elgio Schlemer em 13/08/2009 | Blog: https://profelgio.duckdns.org/~elgio


E existe algo que o Java não tenha?



Desafiando alunos a realizarem a quebra do N, cometi, certa vez, a "bobagem" de dizer que Java era lento! Na verdade era epenas uma brincadeira, uma alfinetada como as que faço quando o assunto é sistemas operacionais.

Esta minha brincadeira feriu os sentimentos de um saudoso aluno que se esforçou para me provar que eu estava enganado. Ele nem quis os décimos pontos na prova como prêmio para quem quebrasse o N, mas apenas me enviou um programa em Java e alguns parâmetros extra-terrestres a serem passados para a máquina Virtual Java a fim de otimizá-la.

Resumo da estória: a solução em Java realmente empatou com a solução em C, considerando a mesma lógica. Quem mandou brincar com um arquiteto certificado pela SUN (e acho que se o Diego Pacheco ler isto, terei problemas, pois sei que ele ainda quer mostrar que o Java é melhor! Grande Diego!).

Não passei a programar em Java depois disto, mas tive que ter mais critérios ao fazer meus comentários em sala de aula.

Basicamente em Java basta usar alguma classe que forneça suporte a números Big. Uma delas é justamente a classe BigDecimal.

Como exemplo, segue um código em java para o cálculo de fatoriais (uma adaptação do código fornecido por Diego Pacheco):

import java.math.BigDecimal;

public class Fatorial {
   public static void main(String[] args) {

      // Para cada argumento do main
      for (String n: args){

         // converte string para inteiro
         int f = Integer.parseInt(n);

         // Inicializa fat com 1. Não se pode apenas atribuir, deve-se
         // usar um método para isto, no caso o construtor já tem esta opção
         BigDecimal fat = new BigDecimal("1");

         for (int j = 2; j <= f; j++) {
            // usando o método multiply da classe BigDecimal
            fat = fat.multiply(new BigDecimal(j));
         }

         System.out.println(f + " = " + fat);
     }
  }
}

Salve este código com o nome Fatorial.java (mesmo nome da classe), compile usando o javac (isto é, gere os bytes codes) e execute com java Fatorial 200:

javac Fatorial.java
$ java Fatorial 200

200 = 7886578673647905035523632139321850622951359776871732
63294742533244359449963403342920304284011984623904177212138919638
83025764279024263710506192662495282993111346285727076331723739698
89439224456214516642402540332918641312274282948532775242424075739
03240321257405579568660226031904170324062351700858796178922222789
623703897374720000000000000000000000000000000000000000000000000


Como o Java não tem suporte nativo a números grandes, tudo precisa ser feito através de métodos. Isto é, não é possível comparar duas variáveis em um laço apenas com um < ou >. É necessário executar um método próprio para isto, como:

import java.math.BigDecimal;

public class Compara {
   public static void main(String[] args) {
      BigDecimal zero = new BigDecimal("0");
      BigDecimal um  = new BigDecimal("1");
      BigDecimal grande   = new BigDecimal("987654321234567689000000987765");
      BigDecimal grande2 = new BigDecimal("987654321234567689000000987765");
      int resp;

      // Comparando a variável um com a variável zero
      resp = um.compareTo(zero);

      if (resp == 0){
         System.out.println(um + " e " + zero + " SÃO IGUAIS");
      }
      if (resp > 0){
         System.out.println(um + " eh maior que " + zero);
      }
      if (resp < 0){
         System.out.println(um + " eh menor que " + zero);
      }

      // Comparando a variável um com a variável grande
      resp = um.compareTo(grande);

      if (resp == 0){
         System.out.println(um + " e " + grande + " SÃO IGUAIS");
      }
      if (resp > 0){
         System.out.println(um + " eh maior que " + grande);
      }
      if (resp < 0){
         System.out.println(um + " eh menor que " + grande);
      }

      // Comparando a variável grande com grande2
      resp = grande.compareTo(grande2);
      
      if (resp == 0){
         System.out.println(grande + " e " + grande2 + " SÃO IGUAIS");
      }
      if (resp > 0){
         System.out.println(grande + " eh maior que " + grande2);
      }
      if (resp < 0){
         System.out.println(grande + " eh menor que " + grande2);
      }

      // compareTo tem retorno semelhante ao strcmp do C:
      //    retorna 0 se iguais
      //    retorna > 0 se o objeto do método for maior
      //    retorna < 0 se o objeto do método for menor
  }
}

Todas as demais operações são métodos, como a de soma, multiplicação e divisão. Somente as linguagens que tem suporte nativo em sua sintaxe, como é o caso do python, permitem usar as operações aritméticas normais. No entanto o Java, assim como o Python, consegue imprimir o valor sem a necessidade de expressar algum método especial. A impressão é feita normalmente como qualquer número.

A versão em Java, sem otimizações na invocação da máquina Virtual, demorou 1m15s para executar o fatorial de 80.000.

Página anterior     Próxima página

Páginas do artigo
   1. Introdução
   2. Dividir para conquistar
   3. Esse Python!
   4. E existe algo que o Java não tenha?
   5. Comigo é no C Ansi
   6. Conclusão
Outros artigos deste autor

Túneis cifrados com SSH

Estrutura do Iptables

Iptables protege contra SYN FLOOD?

Guerra Infinita, uma análise da Ciência da Computação

Sinais em Linux

Leitura recomendada

Tutorial SFML

Alocação dinâmica

Compilando o Mono 2.2 no Ubuntu 8.10

Acessando a porta paralela via Linux

Mapear objetos em C

  
Comentários
[1] Comentário enviado por clovesjr em 13/08/2009 - 08:52h

Muito legal Elgio...

Para os iniciantes em C (como eu) isto é de grande ajuda.

Agora finalmente vou conseguir implementar meu código de forma eficiente para tentar vencer seu próximo desafio... :-)

[]s

Cloves Jr

[2] Comentário enviado por elgio em 13/08/2009 - 10:42h

Este artigo foi escrito para dar uma luz àqueles que pretendem ganhar o livro!
http://www.vivaolinux.com.br/topico/Seguranca-Da-Informacao/Desafio-2-RSA/

Antes, porém, uma leitura ao artigo http://www.vivaolinux.com.br/artigo/Criptografia-assimetrica-com-o-RSA/ se faz necessário.

[3] Comentário enviado por andre.vmatos em 13/08/2009 - 13:39h

Nossa, elgio. Parabéns, novamente. Sempre esbanjando conhecimento e método. Parabéns pelo artigo, muito bem escrito, incisivo e útil. Por favor, continue assim. Vlww

[4] Comentário enviado por removido em 13/08/2009 - 15:56h

Bahh, esse cara só escreve coisas legais! Fez renascer meu interesse pelo vol. Eu já estava cansado de tanto "Linux para iniciantes", "Impressões sobre o Ubuntu", "Instalando o Kurumin no Laptop XYZ", "O software livre é o futuro" e outras bullshits repetidas. MASSA!

[5] Comentário enviado por removido em 13/08/2009 - 16:11h

Cacetada! Pedi pro script python exibir apenas o resultado final e executei ./fatorial.py `./fatorial.py 1398273683131` há 30 minutos e nada!! Será que algum dia vai terminar?

[6] Comentário enviado por elgio em 13/08/2009 - 16:13h

bpiero: logo logo o programa irá ABORTAR por não ter memória suficiente para alocar o resultado!

:-(

[7] Comentário enviado por removido em 13/08/2009 - 16:53h

Mais uma! Utilizando o programa em C para calcular o fatorial de 100000 e enviando o resultado para o more, comecei a visualizar aquele número interminável grudando o dedo no ENTER. Acontece que deu pra perceber claramente um padrão na imagem abstrata formada pelos números subindo pelo monitor, pareciam fitas enroladas em hélice, simétricas e contínuas. Bizarro!!

PS: adicionei uma partição swap de 40GB para terminar aquele cálculo anterior, pois sou brasileiro e não desisto nunca, hehehhe

[8] Comentário enviado por gnu em 14/08/2009 - 09:10h

Excelente artigo. Programando e brincando. Minha professora de java simplesmente me disse que usasse o double.. nunca nem se tocou que eh uma questao da estrutura 32 bits....
Quanto a seus artigos, são realmente ótimos... como disse um amigo acima, fez renascer meu interesse pelo VOL. Todos os dias abro o site pra ver se encontro interessante que vc tenha escrito.

[9] Comentário enviado por Teixeira em 15/08/2009 - 11:42h

Parabéns, Elgio.

Muito embora não passemos toda a nossa vida calculando fatoriais, certos conhecimentoss são muito importantes, tornando-se isso por vezes o fio de alguma meada ou o próprio caminho das pedras, ajudando-nos a solver outros tipos de problemas...
É o conhecimento que diverte, ou a diversão que educa: Não importa a definição.

E tem gente que faz muito mais que simplesmente escovar bits:
Trabalhei em uma indústria onde o controle de estoque somente era possível através de uma técnica (em linguagem de máquina) que dividia cada byte ao meio, e cada metade controlava um produto diferente.
Observe-se que para isso uma das metades ( a que contém o registrador SO ) que tinha de ser "enganada" e usada integralmente para armazenar dados...
Já não me lembro como se faz isso, mas a coisa era por aí.
Detalhe: A memória total era limitada a 512 bytes.
Não fui eu quem implementou esse sistema, mas alguém o fez, a partir de alguma idéia e certamente de bastante transpiração. Criatividade, conhecimento e dedicação. Muita dedicação.

Então, conclui-se que algumas coisas que podem eventualmente parecer "inúteis" , "supérfluas" ou "doideira" (como calcular fatorial, raiz quadrada, dividir bytes ao meio, etc.) poderão ter o seu dia de "Eureka!!!!" bem mais cedo do que se imagina.

A propósito de Python:
Existe um software homônimo (um personal messenger) cujo logo é o de uma serpente de aspecto terrível, com enormes presas inoculadoras de veneno.
As pitons no entanto, assim como as jiboias e as anacondas são constritoras e não possuem presas nem veneno.
No entanto, o nome da linguagem Python não vem da serpente, sendo apenas uma alusão ao conjunto Mounty Python...
Desculpe o pythaco...




[10] Comentário enviado por jlvidals em 12/11/2009 - 18:27h

Caro Elgio, você acha esses números grandes ????
Veja o que siginifica GOOGLE. Derivado da palavra googol. Só a título de curiosidade. Gostei muito do seu artigo. Acho até que você já sabe o que é GOOGLE, mas ... é interessante a história.
abçs

[11] Comentário enviado por inacioalves em 17/11/2009 - 21:57h

A matemática é algo incrível.
A computação é algo fascinante.
Junte matemática e computação e tenha um dos temas mais instigantes do universo.

Exageros à parte, encontrei este link
http://gmplib.org/
que contém um material em pdf
http://gmplib.org/gmp-man-4.3.0.pdf
para a biblioteca GMP (GNU Mathematical Precision) que traz diversos assuntos interessantes sobre cálculos matemáticos com números arbitrariamente grandes. Dois deles: o algoritmo para cálculo de raizes quadradas e o algoritmo para o cálculo de raizes n-ésimas.

Acho que isto resolve o problema de não existir tal função na biblioteca bn.

Até mais!!

[12] Comentário enviado por rob_som em 21/12/2009 - 01:05h

Parabéns elgio!
Ótimo artigo, nossa, sempre leio seus artigos e acho ótimos.

Por favor, não pare.
Abraços

[13] Comentário enviado por tulios em 25/12/2009 - 19:27h

Parabens pelo artigo, muito bem feito.

O tipo Integer na linguagem Haskell têm precisão ilimitada também.

[14] Comentário enviado por mister_goiaba em 20/01/2010 - 00:14h

Olá professor, parabens pelo tópico
venho acompanhando seus topicos relacionados desde a criptografia RSA, materia relacionada com o que eu pretendo apresentar na minha monografia, criptografia quantica na verdade.

Gostaria de saber, se por um acaso, vc ainda tem os codigos "extra terrestres" aplicados na maquina virtual java para trabalhar mais rapidamente com numeros grandes, pois seria de grande valia para mim.

obrigado

e mais uma vez, parabéns pelos tópicos

[15] Comentário enviado por elgio em 20/01/2010 - 10:42h

Olá.

No artigo eu usei a palavra extra terrestres para uns parâmetros de configuração da máquina Java para executá-la mais rapidamente. O contexto era um desafio a um aluno, pois havia dito que java era lento e ele me provou que pode ser tão rápido quanto o C. Não uso Java e nem lembro mais deles, mas posso dar o seu contato a ele, caso queiras.

Quanto aos códigos, como este artigo foi uma ajuda para o meu desafio sobre a quebra do RSA, os códigos que permitiram quebrar o desafio já foram publicados no artigo do vencedor: http://www.vivaolinux.com.br/artigo/Quebrando-a-criptografia-RSA/

[16] Comentário enviado por mister_goiaba em 05/02/2010 - 21:51h

Olá elgio, desculpe a demora em responder, viagens de final de ferias =D
Por favor, passa o meu msn a ele sim. Ficarei muito grato. lucas_siqueira@live.com

O meu interesse seria mais na área de agilizar o java mesmo, mas vi o tópico e assuntos relacionados a criptografia que vc postou (infelizmente depois de já terem acabados). Tivemos que fazer um trabalho semelhante na faculdade e daí que surgiu o meu interesse mais aprofundado sobre o assunto.

obrigado

[17] Comentário enviado por Nitro em 24/03/2010 - 02:31h

Sem querer ofender nenhum amante e defensor das outras linguagens, mesmo porque, ate mesmo o autor do artigo nao fez menção a isso mas pra mim so mostrou a superioridade do C em relação as outras linguagens. Vejam bem eu entendi perfeitamente o que o escritor desse artigo disse. Mas vamos combinar:

Fatorial de 80000 em C calculado em 18s em relação ao Java 1min e 14s e ao phyton 50s!!!!!!!

Na boa gente sem querer humilhar e uma goleada das grandes!!!!!!

Mas cada um usa a que melhor lhe convem. É como no futebol já ouvi muito por ser flamenguista, mas é o time do coração e não há o q dizer!!!!

E viva o C

[18] Comentário enviado por danilo21 em 31/07/2010 - 17:30h

Bem legal! @Nitro, obviamente python e Java são mais lentos que C, é claro que dependendo da circustancia e do programador isso pode variar, mas lembrem-se java roda sobre uma VM e python é interpretada, então é natural que C, sendo compilada e rodando diretamente sobre o sistema, seja mais rápida que elas. O problema maior do java não é a linguagem, mas a Swing, acho a swing bem pesada e lenta, mas até que é uma biblioteca legal de se programar.

[19] Comentário enviado por felipemartinsss em 22/09/2010 - 13:01h

Atualmente estou pensando em me aventurar por assuntos da criptografia e esta era uma dúvida que eu tinha. Como manipular números com tantos algarismos. Fiquei surpreso com C vencendo Python, mesmo Python oferecendo o recurso na própria linguagem. Bom artigo, parabéns!

[20] Comentário enviado por uberalles em 30/11/2010 - 11:40h

100% excelentíssimo!
acho que nunca vi nada tão bacana e bem explicado por um professor!

[21] Comentário enviado por vergil_sparda em 11/12/2010 - 14:50h

Se não me engano (corrijam se eu estiver errado) as linguagens Haskell e Mozart (Oz) tbm tem suporte nativo a esse tipo de coisa.

[22] Comentário enviado por janunesdemor em 16/12/2010 - 19:53h

Prezado professor o fatorial de 6.000 é este número pequeno abaixo.... kkkkkkkkkk.

professor gostaria de orientação, para aprender a programar em C++ um bom manual, passo-a-passo, tipo do CLIPPER... Mas algo, como criar uma agenda, uma calculadora em ambiente, de texto e gráfico.


26839997657267395961163166474627355122050186046884725685824261445661070965868578859479409748346329836182703089128852632609939583160469201526637034786976396625075825887529584878861523984702266296018595427551580174654216923424895644549809732165397549500287960097044436776098097112285935902002318300817766074944639865419157280524790653203290253917356133633993978535760253069357555142219669129998317026518032402810751448010557484004254745274140263837210122325107062378927575415179640798325598920907738968963426553833519168033920097139867697345016081563676374441238664213080213666256929097791375199485350231595456497900149202746728755327879812971546373369370677385700341673192285360910112728679385205719710580583641371671892447976818829243817888754721448962887123232268424960754147650482415903026606790467209849563662271416952282649322598751397802523984319920253594583722082455006753362159905925741054970039726329277310783778301896111639647389105189524695731748039744831330171194849813750142198591661331367731897270827642663650121154179844927245869455452866090540869550194618984743649127756540595329147696682931012739858611204283134522143082978255200048338318229115382675077435011021122203657208296645354100711784246537108376427936888332083853865732544562471022466209428262367892766813822586238730884186670640599681155203053263579261264327036948384088756702762253306671361116697006843642834443792187068184967415329762543330480264694132001091536593658869788389814480927116885215169756787073551910689019283750895017493228111116730310828166766041200531056382164323390539713295116741388483967745305691786537941332339818667917676571370007419397773475261943894514052312932289624661769878012350676494947730866831924804552851197759345191254081631464738416269147789847963818212281155896550427170387285980460490951645441243497814514002972833731020681426095160149778141037573688491521442522428544788969389558278761397481348218877157739113180534110050023212126419438699172726154425655036249509154341846353246115757571655397172997888622515217725681355507009805113242461343462749671452788638077124750445775923725491807857904696015889810582915109267213212215315203713159208649674164979719727312920576511559196470602174361303899231649894912510856185814740917226239172072546201539584906050452246863211300948544262550662310529984226992582651085151214806862737544037624184170092436908438597773909311650839302124106743539756133701430549822835175979119647543081774334757846025648778275567966409017115828239278838608964398135300219592308860564771741370352802721328544196035203258913677288304583292026902650292022615233949477454247380613913727205962978808266843078181782521529295663178723309967551512319985570114605975081675370544606833051518171905908225228981315998888508641383754110684161710540379573862750847847505118932108687343116259504882707915331968334989766476215094439032763933829258296825600807659383396331656916379451344784802449899227776335723347766390689666241963170367393391210821232042808302473264063265570110727719831475689561404967877066430429903848880193864377881446218231571439631758568428463947148118858717809903748434222683956452043663618862381077166736163904143611771876372531590296726023035330673799952066924105529602223046628759245420801826722083980921568005211239250818157044712443998577051201694386666676548459139059534955603452332498091561411572853622851267073396054099014969366801494527706537595304138848480664476770533265090362642331386328673912578619209255162812445589840156651576378448310470200887299943392878434964998167663977882887221263096306624719352570216017537901919095997174491423825076915901844828299728867068358932893173855581339383152432283675932309139108086846506216370866033080621523840531146755934097307408215697024409051687603668777226806830415433795410593140890416931031058084357039568102702638999494225749379427539899477901253728525589333527959277554441588267988641971876672848522278885432950000713174717818564119905187925226030650056997215832606755915139333987912157419842331744288642889962577622559173461092061337782792800669889998655960852746942113164577327334884576755813786481634749877236127180350856907734255684011438108061579128976722956572293429802773951504460935383493894278312699763923245547175663397346989022015320010667525912457679400581483705019548056855672703674896854737678203776369140756376089462449280006665661035666006921950987386872094427675301957693502233910568049172906194746954125886626269172858815989476855674311523872846329821400400763827646130537527272350995090929517107381022804145383611938945290186877390668234661029799097681602379568029119838560091291614083678024113699512262414222827129371338079435110215172704049731560918699244509728283556069827037741673013342110878227016581208632447654168805338374785489229037504121557638213364969795134613946880198143598744934254049047652000435648260460315689718953671559931084783230022864563599174390561242416515649909885274704141042481089882030312456111711513802717240135242476854435918803605162485964256860285707437162161523150880602244588082288703552459412578484347249931541710133937268355470525564025317366479302263333297793229701722268518487745423309476454825885688563656328669909328960726227217746513974012608523837157894646126497155495847558779670772281055345753896529609284835447408379437232766596325245729441678426804018266486446041738028201210588974259726818731212691907209410450960012489269359303557141418261872878840153018432632743047491241142213154307261531976744986085767078659204961267418144728791274812585877377270787860181952296269435846032835432665015604490686890958244706686381824599477501861516682019378871555372510865803678658691697941102766320731311969158487304120286437862145736732394203678256089895044788570688165095904488684541547213265814760800903192224668435587633646241787956794671777024535537548677669344734391033706602943613442496123847673685078921583639566511433247002826913206025495210184332820453059341772597886542104466355672414361321525270662898671590256225316736799329288004282209029227977496988338803694599926602334918886851384115767529046261566167879067415004412013981026431670302781024110519975053809251441552664436695119607254616839235405097220832844999496406932610321750880717707526257155144479558265577121457883354130966058460949905183541920784685810495511824633564623203622545752285048322601540147114940477282319089885604719594322274307570377569828497611795106065649907604825505236501660518162575599118468736316043306834159987187831281295962021538609891359958084877685159675050166947628016488026431953172281900387230968173782146563168653588630286211011668433441333823075581919363824362932880427831430556053108507046246421196140219366978834558974462588436923645529385600025541518596699322797933616685250622157597463243707453327414164942163090126405769853433010109206938295039098203538385660049440677153410981199879428054550229069777536610109500673593952523016334494523561068250729979121779184363748140628442779681000417566359474204167681174820176728969043370649673522631060265357110075973952347360362984289840155659432230548753561511108669634362621654405756411713538358908721730705960390405977938491036511919613427919440128566811728681598359611378946010125676443438082247070490023185084235213042639811189709583244714164597763501116307625848095008701493449513079965992954097684158860941655430946986067589018614170778141474686227232765295039894254082902355866495212825729079245813851076586228786055451349969723070416315974239445690393038118202725795105519781134231015178521890424346496650894181117354609245262021371137195676841189511521902507335137574217501870437614126135353094126084804313051200792975952140413789628883243769036385641778001621627161816525820367941544906943954307963287899647807608555063949916962195279711901809586155318819699397668051655460229580017948563694384203283404278464809965543259459238690367209746182768863741318400635630079422528479763675001256831936882203374586645618033291782515494021505175038624781840272794622469978853958785054623954499516285871397211907425386069707751534411059083177014806958625176529207667888992864932992747415768392548848256304173508923017783002188862774976889301189512631658135171879154140083392136382819310890513335161935706439544652866330201623448052563814824077603326355508933605604424600448291508530124857820023813927063948608641347736250592506112490756973272230629775646381758420315977437335059628471695549795691293756712366294481331175001245733081851145135484800803418840241315976099255095439620940223136901994965329154153506574920570848498252125571529713557668092811195646136559978088820601346208029112370733158792968907458126312371445670688267987605112516475243208816963302038466447547681765253439647124033397270561625609556398590434964457944954309646474894650904853218921957202959530304641111659297682838865324856282312400884964347702070305433879310515186656471481638169102808581722273535412432597450682370732570982895174461945607104365181581376611951264796184795738549839706427908331191819986570317688182995627653773550817877954776508879127635456487418504926881654920604279454152324325660886511272516911299135838141087303316226745988807478038370462171963678341308873095934247673904776115988991225795671253759564756119735443325022586469345409028644380587414699081655676862737273868437940818179561003406992360965199467481546972908696465933739781519701659242335232356415466038443338391940395961378869736803878457355977659711442530839903609720790079863076058058715425763090531370117042825661461468549528115981158562216417882781509664853084610831510279505043600822370480590602567198336194062784913269731422406383973451453248248130283541310749558344183861427625568458608812548097423428774920090092328407439640342723637863396368920858582855416845188111542427327700990645690098745755247279065598056279137864634712015208857329539219829853397466428466858279087009752509271828426898571834909681863109405566656445800488441033946511794342431604565168864967057267397568220363992954730588476055451427487747065978279654894963593073322993554421804132579318498274537173107483494533189509118093004443180291631727515000642142157865267493042953936254541488985234518070473671110935727926968656415152473303726109624468629752844760557073833637378230650501221082633697198807510860468850341272344748512661777090799274894787545289009052176976539368742406207723182280541002309464890868562316823514637242729903960306443521003257332856088639395551668126821383301629329766797786756596435530484560778049737215792030674205303205801908027014371344418997505156595085966936182094633009369957887739382905617186959592994679436161215891491201560010002303562861512545655665533747304126090814958091971128086726263385122624660641970132348294803564477594695720793602492116938354646938946023345419380616330196587711018244015684782598722707267350042318261118692659787623138728964220486865730904538203308544993585204324572483911221951329505157910024779477100406637724879026557148888479697973570421165075760846187884313379621653231257431521388920581117855569927930918809429389097758561316947040253818657366569583216996595880452085181969727435761566711982292456039046952519493321075973470394810159148251758971126592230257412888072670817718837506735539095364155132814201524878117711434829903313602637604260588611935665177670745833721998953303904895239132068265377922420627009779809889466755971872455555671343784690265355346881170795850018502852129370131161465211107369431679795035652082821361480112682380161016649435674734177637483728801571862040064044726291609723825892762153360165674913318950680706277824100457440373632584431075427676529506977563628228527378494844207021130124323451315757493502535786767998535944780419236802727365935448267569554728569057360166647462125575250193177849662065112241470787761620611464498899026682166757218791373813761401747102822467889867257511968031588511731267040532584303876277822386722669253577220369208701354730560681156009035093927791766748395744314207149124473135012255460731267410179450581153432937372865433287334462578361944819245261635417883590093899730240806210512987059139039755719239516747955096168654356635774845296249238132200083290844308330305768505442081037956814356669229273485720031048841792343104465806889538587267438148348731529650107764155019749250703132742148481239788685811391010900182490909954694363129618125365471934712122838075498656865915837228681461906354109534852326705549753619056082390581591133714455250473306727306242271394575288348548899421857457448892069402326062432879273585649517014441861740184183732637647917145400133596746174058308263937278934908107861989223858703458125139822476496470077529071243260203480002394510173588464682577409130875845159623990027664682239590745295239264283065594285434091436489253442921825135707791449628982248064677091483840909115145896107493834857848808071214338290234872083621079923598950627418060690376874046447264041880157359247953759911121569430096089834446296806860114670291023641209580290186092260745512341049839125320156048602734609882451486484322548326755005290081487345389836313565927731311793288362110072115999613152199117256916818999608708250621912549461311254907765260632070362318972418308599585793874193787083482250701523909384993325593106521905136810593360648610894682072245554224301126571410508286122161010810045817773370919374379062289989596224173452184331945051277917796601154892023168491463596096169598616821643671175696854206049100409006169078167430243904473349850147863726706105693676072525164576151294211311629974748183761004606695897909323902577614980463372076919222259328236178404969041379181515374344242733626249558454232062869892488352165799933907917509540768234595160387324388181683690007433113673985430304052495927693685462083670005908633301178630874993739635956858976116348960179166726796605516490861400434448117862153583360984970496289282786486924122320805439939104334341019564178399582455126220556116076741160779832290603975886951147801032161856144959140749293512916086914534660610841694647041611561923866814230934483566399542264717552387574974421387272230796502177946284221874524930330498681663359921010552038845486760571928329559123276961732134968947802118912623447421785908853884067148125440069829365065220130190616955378432426153891483828105402950511840637876877234184400942653059494517924357669899733289658380086660623384775909557622020560227651865360538523553843745107362962392805230202092309660311635156423561540681110235178761462251944120644292834726236559729720149026752335625188787684395265448115729660748799089328448221254102231043203399148743725714335765832853961835178566475440498860100869638052637605743373122008063627879684909029232858931089061916343578608313417391750989970302069749103922130012341608004119286343965424842059261793368728098393595453691033567327108159117557620000953888329412084429827988048791349759502464645602759589914538960491613793478214629274343372792133917392650045082328532754264581760884356541693444000522135818927662083734901101455655254750765419245440999083696076591953649097658590724853350795572415019126863241169128496172523992207344038102394497164800269534560712698912118761394346980783745339986140508718446774224385072467747565302711974864997611631470554269949908627401966447196716914845339410483869892524887982754042429506250673628968228718414012061643077451598342070312729529554773622909551294617485271223447001479812256152081338761827213750484285102947543191716410061394064195110279165734257137718743900404114109584078987879890440446197685164429076990775186914399945755358951691014258339827760688101039687288938837826076976979306089014797721238103646612279704260840216938322762615799981033899782421339230193365498507592907351317381230515558484120284158045864263284108686716827733330001944050406926490472871149620911685246815731101319508907675308813751230736133469124878367785484098823175312278896475273717682187775471894949719361716988670517703295238021800981249818686821379075877402467161140894884709253873700243744595822568080593124662675402754125916201532030537520491201173394159061364948483059596580316726712605307448924989087569963854988789985035890309396965302398195067375747112091617600630569062324899570087096741838973750680880832943381845733445043322194272393030455106292621745244865065398232650227634039186524858034442435811685990620469599080320964512829736284194196458596854413094883125022632141852377393629837683566291882367008185503452296814405791004709850786420099334456302025779045784575829371702458061571747687640159115139743805106923198622400343083944895587534294586812991787254524635520715077762098659988456250623733754110464719122690522791780240030691459123414760105186968091990914114056819616384834492304501039162508627073767169780478967830496186463014833978072637257898856860747927869572485404472280339434886585112737960619322714849939180667763616427956312853138705840775032899047093993945041239132207332617958940173285759309420189320639459634009108821270840450430079776452768788377382406303880576440235086778433484851147247590306073275962761489160541273044410581057507318552527566462489287493173796287417367511276543141860934682205107397952449995571915189415486555443905015245009447583374122394632411846254123646430760547330754177908127719307103338704379090318774174414339548060789758654183769135018414808654059391380421542898999289131982752881304432914119165614021131474301910193653981743294360179900258947239179416931113274497477055056916721815325178771881770427595574526979969110609812671390052073967371528725049419557297254899779063252161056890215846180637435165931765123585887180135444817679943914033515786523995512366445378614290524518063186195499410292577340893661060140730842547355544924489906477904545600765784171496375614289338782329243001810188831870754174818902702669589149513609444235544045909168745079904116721850001084293630774744710684207973526258512853651361135504092112982975885188330480138649740482126293824415540863298341430414394251739591197379088280472305756923345573771556994641103276622032051635549987509769751669795304800617960120841579720909823273146247520919870094496829700346067978778444534370898712922626727560847873952959479373409336411773191732428874668314482333129065714938545538758040915539353017303882622304962799500823467650949423108117514476739529568772483484088052527412492835298965051496826879243767284255331909921087629905226018279220902892396229790261576968836481928703175145314086183266916645372130046603087776005949156839867209518985438312000494875144235247146892718470881434056042405573649073820901746077355841968175323686311247214811449866295517680784346062675700080180133241281272872960000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

[23] Comentário enviado por wisetux em 15/03/2011 - 16:10h

muito bom :D

[24] Comentário enviado por cristhianbini em 13/04/2011 - 00:42h

E por falar em programação, que ira programar os computadores quânticos? rsrsrss

Muito bom artigo!

Cristhian Bini

[25] Comentário enviado por elgio em 20/05/2011 - 11:20h

Mesmo código em C, mas usando a biblioteca gmc, do gnu.
Necessário compilar com -lgmc

#include <stdio.h>
#include <gmp.h>

int main(int argc, char *argv[])
{
mpz_t fat;
int f, i,j;

mpz_init(fat);

for (i = 1; i < argc; i++){
printf ("Fatorial de %s = ", argv[i]);
f = atoi(argv[i]);
if (f<0){
printf("ERRO\n");
continue;
}
if (f<=1){
printf("1\n");
continue;
}
mpz_set_si(fat,1);

for (j = 2; j <= f; j++){
mpz_mul_si(fat, fat, j);
}

mpz_out_str(stdout, 10, fat);
printf("\n");
}
}

[26] Comentário enviado por albertguedes em 14/09/2011 - 15:58h

E ninguém se lembra do fortran, que foi feito especificamente para essas coisas. Tá bom então =(

[27] Comentário enviado por Portella999 em 28/02/2012 - 16:14h

Muito massa Elgio!
Parabéns continue assim sempre trazendo novidades..


Abraços!
Excelente Artigo!

Yago Portella

[28] Comentário enviado por andersonnf em 01/05/2012 - 10:57h

Muito bom, parabéns!

[29] Comentário enviado por rafael.dsantos em 14/05/2012 - 17:03h

No Python ainda podemos reduzir ainda mais o código !

num = int(raw_input("Entre com um numero: "))
print "O fatorial do numero digitado e : %d " % reduce(lambda x,y:x*y ,range(1,num+1) )

http://vivaolinux.com.br/script/Fatorial-de-um-numero/

Parabéns pelo artigo!!!

[30] Comentário enviado por phoemur em 24/05/2013 - 19:40h

Comigo é no GNU Bash:

$ time seq -s'*' 1 80000 | bc
(...)
real 2m21.791s
user 2m21.382s
sys 0m0.015s

$ time echo "a=1;for (i=1;i<=80000;i++) a=a*i;a" | bc
(...)
real 2m22.936s
user 2m21.542s
sys 0m0.973s


Lerdão...kkkk Mas funciona...


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts