rss
twitter
facebook

Home

Combinações / Factorial

#--------------------------------------------------
# codigo em linguagem c
#--------------------------------------------------
# main(void)
# {
# char s[20];
# int n,p,cmb;
# printf("Insira o n: ");
# get (s,20);
# n = atoi(s,20);
# printf(" Insira o p ");
# get(s,20);
# p = atoi(s,20);
# cmb = comb(n,p);
# printf(" combinações = ");
# itoa(comb,s,20); printf(s);
# }
#--------------------------------------------------
# int comb(int n, int p)
# {
# return fact(n) / (fact(p) * fact(n-p)
# }
#---------------------------------------------------
# int fact (int n) /* algoritimo não - recursivo */
# {
# int i;
# int fct = 1;
# if (n<=1)
# return 1;
# else
# for (i=2; i<=n; i++)
# fct = fct * i;
# return fct;
#---------------------------------------------------
.data
str: .space 20
prompt1: .asciiz"\nInsira o n: "
prompt2: .asciiz"\ninsira o p: "
prompt3: .asciiz"\nCombinações = "
prompt4: .asciiz"\nResto="
.text
.globl main
main: la $a0,prompt1
li $v0,4
syscall
la $a0,str #
li $v0,8 #
li $a1,20 # Leitura de n
syscall
jal atoi # invocação da função ATOI
move $s0,$v0 # n=atoi(s,20)=$s0
la $a0,prompt2
li $v0,4
syscall
la $a0,str
li $v0,8
li $a1,20 # Leitura de p
syscall
jal atoi # invocação da função ATOI
move $a1,$v0 # p=atoi(s,20)=$s1
move $a0,$s0
jal comb # leitura de Combinações(n,p)
move $s2,$v0 # $s2=comb(s,20)=cmb
la $a0,prompt3
li $v0,4
syscall
add $a0,$0,$s2
la $a1,str
li $a2,20
jal itoa # Invocação da função Itoa
la $a0,str
li $v0,4
syscall
li $v0,10
syscall
#-------------------------------------------------------------------------
# Função ATOI (Converte string para inteiro)
#
# Parametros de entrada n--> Tamanho da string
# *s-> Array de string
# Retorno num-->Nº imteiro $v0=$t4
#------------------------------------------------------------------------
atoi: addi $sp,$sp,-4
sw $ra,0($sp) # salvaguardar os registos
li $v0,0 # num=0
add $t1,$0,$a0 # p=s
add $t2,$a0,$a1 # s+n
while: lb $t3,0($t1) # *p
bgeu $t1,$t2,exit1 # if (p>=s+n) go to exit1
blt $t3,'0',exit1 # if (*p<'0') go to exit1
bgt $t3,'9',exit1 # if (*p>'9') go to exit1
sub $t4,$t3,'0' # digito= *p-'0'
mul $v0,$v0,10 # num=10*num
add $v0,$v0,$t4 # num=10*num+digito
addiu $t1,$t1,1
j while
exit1: lw $ra,0($sp)
addi $sp,$sp,4 # Repor os registos
jr $ra
#-----------------------------------------------------------------
# Função ITOA (Convert inteiro para string)
#
# Parametros de entrada n--> Nº inteiro
# s--> Array de strings para retorno
# Retorno --> String de caracteres
#-----------------------------------------------------------------
itoa: addi $sp,$sp,-4
sw $ra,0($sp) # salvaguardar os registos
li $t1,10
move $t0,$a0
move $t3,$a1
li $t4,0 # i=0
move $t5,$a0 # j=n
do: div $t5,$t1
mfhi $t2 # parte concernente ao resto
mflo $t0 # parte concernente ao quociente
add $t2,$t2,'0' # resto + '0'
sb $t2,0($t3)
addiu $t3,$t3,1
addi $t4,$t4,1
move $t5,$t0 # $t5=Quociente
bnez $t0,do
sb $0,($t3) # coloca caracter nulo
#----------------------------------------------------------------------
# procedimento troca
#-----------------------------------------------------------------------
move $t1,$t3 # ponteiro para o fim do array
addi $t1,$t1,-1
move $t2,$a1 # ponteiro para o inicio do array
if: ble $t1,$t2,fim # if($t1<=$t2) go to fim
lb $t4,0($t1)
lb $t5,0($t2)
sb $t5,0($t1)
sb $t4,0($t2)
addi $t2,$t2,1
addi $t1,$t1,-1
j if
fim: lw $ra,0($sp)
addi $sp,$sp,4 # Repor os registos
jr $ra
#-------------------------------------------------------------------
# Função Calculo de combinações
#
# Parametros de entrada : n,p
# Parametros de saida : cmb= n!/(p!(n-p)!)
#---------------------------------------------------------------------
comb: addi $sp,$sp,-12
sw $ra,0($sp)
sw $s0,4($sp)
sw $s1,8($sp) # salvaguardar os registos
move $s0,$a0 # n
move $s1,$a1 # p
sub $a0,$s0,$s1 # n-p
jal fact1
move $a0,$s1
move $s1,$v0 # fact(n-p)
jal fact1
mul $s1,$s1,$v0 # $s1=fact(p)*fact(n-p)
move $a0,$s0
jal fact1 # fact de (n)
div $v0,$v0,$s1 # fact(n) / fact(p)*fact(n-p)
lw $s1,8($sp) # Repor os registos
lw $s0,4($sp)
lw $ra,0($sp)
addi $sp,$sp,12
jr $ra
#-------------------------------------------------------------------------------------
# Função Factorial (não recursivo)
#
# Parametros de entrada : inteiro
# Parametros de saida : fact=fact*i
#-------------------------------------------------------------------------------------
fact1: li $v0,1 # fct=1
bgt $a0,$v0,fim1 # if(n<=1)
jr $ra # return fct
fim1: li $t0,2 # i=2
for: bgt $t0,$a0,fim2 # while (i <= n)
mul $v0,$v0,$t0 # fct=fct*i
addi $t0,$t0,1 # i++
b for
fim2: jr $ra # return fct

0 comentários:

 
Powered by Blogger