MIPS汇编练习

来源:互联网 发布:阿里云购买云服务器 编辑:程序博客网 时间:2024/06/11 03:27
【问题描述】输入一个高精度的大正整数S(S最长可达240位),去掉其中任意N位数字后剩下的数字按原次序组成一个新的正整数S’。编程对给定的N和S,寻找一种方案使得剩下的数字组成的新数S’最小。【输入形式】输入有两行:1.第一行是大整数S。其中S最长可达240位。 2.第二行是整数N。S、N均以非0数字开头。【输出形式】输出有一行,是在S中删除N位后所得的最小数字S’。【样例输入1】1785434【样例输出1】13【样例输入2】10021【样例输出2】002【样例说明】样例1中输入整数S=178543,N=4,要求在178543中删除4位,使剩下的数字最小。正确答案为S’ = 13。样例2中输入整数S=1002,N=1,删完一位后S’ = 002,而不是2,即2之前的0也必须输出。【运行时限】程序一次运行的最长时间限制在15秒内,超出则认为程序错误。【算法提示】将整数看作字符串形式读入;删数时,从前往后寻找第一个比后一个数字大的数字,然后删除之,按照这种方法删除N个数字即得最小数字。【评分标准】该题要求输出一个大整数的各位数字。结果完全正确得20分,每个测试点4分。上传C语言文件名为delete.c。    .data array:.space 4000endinput:.byte '\n'.textli $t0,0input:li $v0,12syscall move $t1,$v0sll $s0,$t0,2sw $t1,0($s0)addi $t0,$t0,1lb $t2,endinput  beq $t2,$t1,endj input    #gets(S);end:li $t1,0li $v0,5syscallmove $s5,$v0for:sll $s0,$t1,2lw $t3,0($s0) #a[i]lw $t4,4($s0) #a[i+1]if1:    bne $t4,$t2,else1    li $s1,0    j endif1  else1:    li $s1,1endif1:    slt $s2,$0,$s5    and $s1,$s1,$s2li $s2,1bne $s1,$s2,endfor  #S[i+1]!='\0'&&n>0slt $s4,$t4,$t3       #if(S[i+1]<S[i])bne $s4,$s2,endif2addi $t5,$t1,0 #j=ifor2:sll $t6,$t5,2lw $t7,0($t6)beq $t2,$t7,endfor2    #S[j]!='\0'lw $t7,4($t6)        #S[j]=S[j+1];sw $t7,0($t6)addi $t5,$t5,1     #j++j for2endfor2:subi $s5,$s5,1     #n--li $t1,0   endif2:addi $t1,$t1,1j for   endfor:slt $t5,$0,$s5li $t6,1bne $t5,$t6,endif3addi $t7,$t1,1sub $t7,$t7,$s5sll $t7,$t7,2sw $t2,0($t7)        #if(n>0)                #S[i+1-n]='\0'; endif3:li $t1,0print:              #puts(S)sll $s0,$t1,2lw $s0,0($s0)beq $s0,$t2,endprintmove $a0,$s0li $v0,11syscalladdi $t1,$t1,1j printendprint:li $v0,11move $a0,$t2syscallli $v0,10syscall以下为对应的C语言代码    #include<stdio.h>    #define MAX 1000int main(){int n,i,j; char S[MAX];gets(S);scanf("%d",&n);for(i=0;S[i+1]!='\0'&&n>0;i++){    if(S[i+1]<S[i])    {        for(j=i;S[j]!='\0';j++)        S[j]=S[j+1];        n--;        i=0;    }}if(n>0)    S[i+1-n]='\0';  puts(S);        }