LC-3汇编语言
.ORIG x3000
LDI R0,n ;f(n)
NOT R0,R0
ADD R0,R0,#1 ;取R0补码用于减法
AND R1,R1,#0 ;R1记录循环次数,先初始化为0
ADD R2,R1,#0 ;R2记录符号,加号为0,减号为-1,f(1)对应加号
ADD R3,R1,#3 ;记录f(n),f(1)=3
AND R5,R5,#0 ;R5存0000 1111 1111 1111,先初始化为0
LOOP1 ADD R5,R5,#1 ;本行开始的6行是将R5从1变为所需值的过程
ADD R1,R1,#1 ;R1记录循环次数
ADD R4,R1,#-12
BRz LOOP2
ADD R5,R5,R5
BRp LOOP1
LOOP2 AND R1,R1,#0 ;初始化R4为0
AND R4,R4,#0 ;初始化R4为0
ADD R1,R1,#1 ;记录循环次数
LOOP3 ADD R7,R0,R1
BRz LOOP8 ;循环了n次就跳出循环
ADD R3,R3,R3 ;R3=R3+R3
AND R4,R2,#1 ;看R2代表加号还是减号
BRz LOOP4
ADD R3,R3,#-2 ;R2代表减号,R3=R3-2
BRnzp LOOP5
LOOP4 ADD R3,R3,#2 ;R2代表加号,R3=R3+2
LOOP5 ADD R1,R1,#1 ;循环次数+1
AND R3,R5,R3 ;将R3取4096的模
AND R6,R3,#-8 ;看R3末三位是否为0
BRnp LOOP6 ;若是,则能被8整除,改变R2,否则进入LOOP6,判断末位是否为8
NOT R2,R2 ;改变R2
BRnzp LOOP3
LOOP6 ADD R6,R3,#-8 ;R6=R3-8
BRp LOOP7 ;R6为正数则继续到LOOP7里减10
BRn LOOP3 ;R6为负数则不需改R2,跳回LOOP3
NOT R2,R2 ;R6为0则需改R2
BRnzp LOOP3
LOOP7 ADD R6,R6,#-10;R6=R6-10
BRp LOOP7 ;R6为正数则继续到LOOP7里减10
BRn LOOP3 ;R6为负数则不需改R2,跳回LOOP3
NOT R2,R2 ;R6为0则需改R2
BRnzp LOOP3
LOOP8 STI R3,HERE ;把R3也就是f(n)放到x3103
HERE .FILL x3103
n .FILL x3102
TRAP x25
.END
C++
int16_t lab2(int16_t n) {
int16_t num=3,i=0;
char x='+';
for(i=2;i<=n;i++){
if(x=='+'){
num+=num;
num+=2;
while (num>=4096)
num-=4096;
if(!(num&0x0007))
x='-';
else{
int16_t temp=num;
while (temp>=10)
temp-=10;
if(temp==8)
x='-';
}
}
else{
num+=num;
num-=2;
while (num>=4096)
num-=4096;
if(!(num&0x0007))
x='+';
else{
int16_t temp=num;
while (temp>=10)
temp-=10;
if(temp==8)
x='+';
}
}
}
return num;
}