斐波拉契数列:
斐波拉契数列为1、1、2、3、5、8、13、21……此数列从第3项开始,每一项都等于前两项之和。
设计思想:该数列可通过迭代或者递归的方式完成,本人采用迭代,首先,输入一个整数num,代表一共需要打印的项数,当num1或num2时,直接打印结果,不需要通过计算;当num>2时,先打印前两项的结果,再计算后面第3、4、5……项的结果并打印,该过程则通过循环实现。
下面是C++、伪代码、对照表和MIPS汇编源代码:
#include
using namespace std;
int main()
{
int num; //数组长度
cin>>num;
int *array=new int[num]; //长度为 num 的数组
for(int i=0;i<num;i++)
cin>>array[i]; //循环输入数组元素
int temp; //临时数据储存
for(int i=0;i<num-1;i++) //外层,进行num-1 次比较
for(int j=0;j<num-i-1;j++) //内层,进行num-i-1次比较,每个元素的比较次数
{
if(array[j]>array[j+1]){//按升序排序
temp=array[j];
array[j]=array[j+1];
array[j+1]=temp;
}
}
for(int i=0;i<num;i++) //输出排序后结果
cout<<array[i]<<" ";
delete []array;
return 0;
}
下面是汇编伪代码、代码:
###################
# main:cout<<"Please input the array_lenth:"
# cin>>t8
# cout<<"Please input values:"
# for(t7=0;t7
# {
# cin>>array[t7]
# }
# for(t7=0;t7
# for(t9=0;t9
# if(t2>t3)
# {
# temp=t2;
# t3=t2;
# t2=temp;
# }
# for(t7=0;t7
# cout<
#end:
##################################################################################
# 程序中使用的寄存器:
# t6:存放数组首地址
# t7:计数器,i
# t8:用于存放数组大小,num
# t9:计数器,j
# t0--t4:计算中用于存放数据
# t2: array[j]
# t3: array[j+1]
####################################################################################
.data
array: .space 1024 #分配数组空间
message:
.asciiz "\nPlease input the array_lenth:" #提示符:输入数组长度
prompt: .asciiz "\n Please input values:" #提示符:输入待排序数据
result: .asciiz "\nThe result is;" #提示符:输出排序后结果
kg: .asciiz " " #空格,用于分隔结果
.text
.globl main
main: la $t6,array #存数组首地址
move $t7,$zero #初始化$t7,用于循环记数
move $t9,$zero #排序时的内层循环变量
la $a0,message
li $v0,4
syscall #输出提示信息(数组长度)
li $v0,5
syscall
move $t8,$v0 #输入数组长度 t8 = num
la $a0,prompt
li $v0,4
syscall #输出提示信息,准备输入数组
input: li $v0,5
syscall #输入数组元素
move $t0,$t7
mul $t0,$t0,4 #计算数组下标(偏移值)
addu $t1,$t0,$t6 #找到数组下标
sw $v0,0($t1) #将数据存入数组
addi $t7,$t7,1 #下标 i++
blt $t7,$t8,input #循环输入num个数据
move $t7,$zero #计数器置0,i=0
loop1: move $t9,$zero #每次执行外层循环都将内层循环变量置 0
loop2:
move $t0,$t9
mul $t0,$t0,4 #计算下标偏移值
addu $t1 ,$t0,$t6
lw $t2,0($t1) #获取 data[j]
addi $t0,$t9,1
mul $t0,$t0,4
addu $t4,$t0,$t6
lw $t3, 0($t4) #获取a[j+1]
ble $t2,$t3,skip #如果a[j]<a[j+1],跳转到skip进行处理
sw $t3,0($t1) #否则直接交换两者的值
sw $t2,0($t4)
skip: addi $t9,$t9,1
move $t0,$t9 # t0=j
sub $t1,$t8,$t7 #num-i-1
addi $t1,$t1,-1
blt $t0,$t1,loop2 #内层循环判断
addi $t7,$t7,1 #外层循环 i++
sub $t2,$t8,1 #判断外层循环是否结束,i<num-1
blt $t7,$t2,loop1
output: la $a0,result #输出提示符,输出排序后结果
li $v0,4
syscall
move $t7,$zero # i=0
print: move $t0,$t7 #获取排序后的数组元素
mul $t0,$t0,4
addu $t1,$t0,$t6
lw $a0,0($t1)
li $v0,1 #打印获取的数组元素
syscall
la $a0,kg #用空格将结果分开输出
li $v0,4 #系统调用号打印字符
syscall
addi $t7,$t7,1 #i++
blt $t7,$t8,print #循环输出排序结果
li $v0,10 #程序结束
syscall
当然,我采用迭代的方法,但是并没有给出溢出错误提示,有兴趣的伙伴可以自己看看,加上!