作者shivako (shivako)
看板Programming
标题[问题]mips combination(C几取几)的程式问题
时间Mon Nov 26 09:46:40 2007
我之前用递回的方式去写
不过速度实在是不够快
後来就把脑筋动到乘法除法上面
想法是:假设要从X之中取Y个数(ex:从五之中挑三个数)
我就先检查是否 3*2 -1 < 5 因为不是
我就把它换乘从五之中取 (5-3) = 2个数
然後用阵列把X 到 X-Y+1的数(这题是5,4)存进去
接下来依序把阵列中的X值读出来看是否可以被Y整除
可以就把除过的商存回阵列 拿Y-1去重新再 进行一次
一直做到Y=2也结束之後
把阵列中的所有X值全部相乘
以下是写出来的code:
.data
X: .word, 0
Y: .word, 0
str: .asciiz "please type two integers, and each with the enter key\n"
str2: .asciiz " is the combination results.\n"
strt: .asciiz "got a problen\n"
Calc: .space 64
.text
.globl main
main:
#print string
li $v0, 4
la $a0, str
syscall
#read X Y
li $v0, 5
syscall
sw $v0, X
li $v0, 5
syscall
sw $v0, Y
#start to calc
lw $s0,X #s0 = x
lw $s1,Y
la $s2,Calc
step1: #test if x<y
slt $t0,$s0,$s1
bne $t0,$zero,change
j step2
step2: #test if y*2-1 is bigger than x or not
add $t1,$s1,$s1
addi $t1,$t1,-1
slt $t0,$t1,$s0
beq $t0,$zero,minus
add $t2,$s0,$zero #X
add $t3,$s1,$zero #Y
add $t4,$s2,$zero
#arrayadress
add $s3,$zero,$zero
#arraysize
step3: #create an array to store
sw $t2,0($t4)
addi $t2,$t2,-1
addi $t3,$t3,-1
addi $t4,$t4,4
addi $s3,$s3,1
syscall
add $t4,$s2,$zero
add $t3,$s1,$zero
step4: #start to divide
lw $t2,0($t4)
rem $t0,$t2,$t3 #calc t0 = t2$t3
beq $t0,$zero,divide
addi $t4,$t4,4
j step4
step5: #get ready to calc
addi $s3,$zero,1
step6: #calc
lw $t2,0($s2)
mul $s3,$s3,$t2
addi $s2,$s2,4
addi $s3,$s3,-1
bne $s3,$zero,step6
step7: #output
li $v0,1
move $a0,$s3
syscall
li $v0,4
la $a0,str2
syscall
li $v0,10
syscall
change: #X,Y中较大的 为从中选择的
add $t5,$s0,$zero
add $s0,$s1,$zero
add $s1,$t5,$zero
j step2
minus: #如果是C7取4这种 换成C7取3
addi $s3,$zero,1
beq $s0,$s1,step7 #if X=Y answer would be 1
sub $t5,$s0,$s1
add $s1,$t5,$zero
j step3
divide: #得到商数 存回阵列 检查Y=2是否已经做完
addi $t1,$zero,1
div $t0,$t2,$t3
sw $t0,0($t4)
addi $t3,$t3,-1
beq $t3,1,step5
add $t4,$s2,$zero
j step4
可是连一开始都会有问题 可以告诉我是哪里写错吗
感谢
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.112.106.60