Discussão sobre avaliação de atividade acadêmica.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
!Software para calcular o fatorial de nùmeros inteiros | |
!Desenvolvido por Denrlei Machado da Silva em 18/11/2017 | |
!Versão 2017 | |
program fatorial1 | |
implicit none | |
!Declaração das variáveis | |
real :: a, x | |
real :: fatorial | |
!Bloco de texto para capturar o valor do número a ser calculado o fatorial (no caso a variável x) | |
print*, " " | |
print*, " " | |
print*, "========================================" | |
print*, "****Utilize somente numeros inteiros****" | |
print*, " " | |
print*, " " | |
print*, " Encontrar o valor fatorial do numero:" | |
print*, "—————————————-" | |
print*, " " | |
read *, x | |
!Cálculo fatorial da variável x | |
a = fatorial(x) | |
!Se o valor de x for maior que 31 não é para efetuar o cálculo | |
if (x > 34) then | |
print*, "====================================" | |
print*, " Excede valor Maximo Permitido " | |
print*, " " | |
print*, " " | |
print*, "**OBS – Valor Maximo Permitido = 34**" | |
print*, "====================================" | |
print*, " " | |
goto 42 | |
endif | |
print *,x,"! = ", a | |
42 continue | |
end program fatorial1 | |
!Utilizando o subprograma recursivo | |
recursive function fatorial(n) result (fac) | |
implicit none | |
!Declaração das variáveis | |
real :: n, fac | |
!Se 0 for o valor a ser calculado o fatorial, a resposta será 1 | |
if (n == 0) then | |
fac = 1 | |
!Se não for | |
else | |
fac = n * fatorial(n – 1) | |
endif | |
end function fatorial |
Processo de compilação e execução
zrhans:~/workspace/2017-2 $ gfortran denrlei-fatorial.f90 zrhans:~/workspace/2017-2 $ ./a.out ======================================== ****Utilize somente numeros inteiros**** Encontrar o valor fatorial do numero: ---------------------------------------- 3 3.00000000 ! = 6.00000000 zrhans:~/workspace/2017-2 $
Observando o resultado, vemos que pode ser melhorado declarando variáveis do tipo integer
ao invés de real
. Já a questão do valor máximo para cálculo do fatorial, pode ser usado o especificados de entidade kind=16
[1] para aproveitar o limite da capacidade computacional da arquitetura. Ver U3 – Tipos de dados.
Veja abaixo os resultados do cálculo do fatorial dos primeiros 100 inteiros, percebendo que para n=33 é o fatorial retorna o valor inteiro máximo para essa máquina[2]:
zrhans:~/workspace/2017-2 $ ./a.out
1 : 1
2 : 2
3 : 6
4 : 24
5 : 120
6 : 720
7 : 5040
8 : 40320
9 : 362880
10 : 3628800
11 : 39916800
12 : 479001600
13 : 6227020800
14 : 87178291200
15 : 1307674368000
16 : 20922789888000
17 : 355687428096000
18 : 6402373705728000
19 : 121645100408832000
20 : 2432902008176640000
21 : 51090942171709440000
22 : 1124000727777607680000
23 : 25852016738884976640000
24 : 620448401733239439360000
25 : 15511210043330985984000000
26 : 403291461126605635584000000
27 : 10888869450418352160768000000
28 : 304888344611713860501504000000
29 : 8841761993739701954543616000000
30 : 265252859812191058636308480000000
31 : 8222838654177922817725562880000000
32 : 263130836933693530167218012160000000
33 : 8683317618811886495518194401280000000
34 : -45049567881334322615755997788248211456
35 : 124676958757991025765413114570153656320
36 : 64699745315476902531002227912544878592
37 : 11914008226076149403460180741783027712
38 : 112449945669955213868112260755986841600
39 : -38122888843946684167491727129499926528
40 : -163786086074113512846170655452924215296
41 : 90417809380115242574495275065471401984
42 : 54441957834517090031680871000348557312
43 : -40972381562334372881344799007389515776
44 : -101372954138020089462298119166297636864
45 : -138112166238704000779545465870406909952
46 : 112205324517446769945026111164878159872
47 : 169414748505921235465608113272750342144
48 : -34868877818303820771801141270420652032
49 : -7163178492194900501382885091770892288
50 : -17876557688806561605769647156776402944
51 : 109142658633680748495871817299708084224
52 : -109381988704554957092033826755239215104
53 : -12445163685458847000424491687618805760
54 : 8525894827099188903826663732120911872
55 : 128641848569516926247091897834881941504
56 : 58013814553240137106279522686256283648
57 : -96036239674696819575813281201073946624
58 : -125584030397400119983176590753997520896
59 : 76754278814039117186822509013046919168
60 : -158696408050791457277893963261939810304
61 : -152574617312001916977042750888818507776
62 : 68280000442158124397838452982762438656
63 : -122030742116238187960047358698953113600
64 : 16526943742340630214585014197669593088
65 : 53404242489325573557902100553218916352
66 : 121856335086103220187792562194766364672
67 : -2402355333607370538888911313090641920
68 : -163360162685301196644445969290163650560
69 : -42533116894813274175409835772940910592
70 : 85223119651516978891682962780050161664
71 : -74241109319186841031252576388266328064
72 : 99157999753562861163808218953115762688
73 : 92604276670381132227133227510318235648
74 : 47069135189434515540366687128185208832
75 : 127361469998204030893755460296208547840
76 : 151565446077229370950925974422339715072
77 : 100938872634753805466563377840038871040
78 : 46737626329212166734327500592363077632
79 : -50833556122561926085248134952767193088
80 : 16703913246307474740644492959843090432
81 : -8112494732848399861294499979782520832
82 : 15340165748308138300600216521369714688
83 : -87895710574178374903680458453386526720
84 : 102972384029662704285082853414432407552
85 : -94688897423070185815697252999218855936
86 : 23531627718487142971026820429615464448
87 : 5557409982750657699085732785936138240
88 : 148769711561119414056169877730611953664
89 : -30507980976972224072490571814496370688
90 : -23459352559992458817154603850527670272
91 : -93106881433682971580821305807408726016
92 : -58773918875371798851194948487397507072
93 : -21456584674561877747136490419676774400
94 : 24775242116814272549417545140992475136
95 : -28328567349213352048955463628092342272
96 : 2716469843025911007272351157280833536
97 : -76784792147425095757956545175527358464
98 : -38697558187013188085500063702780477440
99 : -87952224383982522367385624825816940544
100 : 52119101546147813309177310644279443456
Alternativa de verificação:
... integer(kind(16) :: maxint if ( (fatorial(x) > 0) .and. (fatorial(x)<=huge(maxint) ) ...
Referências
[1] StackOverflow – https://stackoverflow.com/q/47614227/824522
[2] The GNU Fortran Compiler – https://gcc.gnu.org/onlinedocs/gfortran/KIND-Type-Parameters.html
Deixe um comentário