题意
让你用汇编实现求斐波那契第n项(n<=30)
思路
比赛时按正常思路想了好写了一发WA了,然后突然想到能不能写30个if,兴冲冲写完WA了,看了遍题目才发现有10^4字数限制,白白浪费半小时。后来实在找不到bug,现场写了个模拟编译器来运行了下,发现运行行数超过限制了(汇编代码写太丑,吃了学校没开汇编课的亏),但是当时时间就剩10分钟了,根本来不及优化,不得已作罢。回去后优化了15分钟就AC了,欲哭无泪。
AC代码
#include <iostream>
#include <cstdio>
#include <iomanip>
using namespace std;
int index = 1;
int W = 3;
void ADD()
{
//cerr << setw(W) << index++ << "|";
printf("c\n");
}
void SUB()
{
//cerr << setw(W) << index++ << "|";
printf("cc\n");
}
void CMP()
{
//cerr << setw(W) << index++ << "|";
printf("ccc\n");
}
void LOAD()
{
//cerr << setw(W) << setw(W) << index++ << "|";
printf("cccc\n");
}
void COPY()
{
//cerr << setw(W) << index++ << "|";
printf("ccccc\n");
}
void JUMP()
{
//cerr << setw(W) << index++ << "|";
printf("cccccc\n");
}
void PUSH(int n)
{
//cerr << setw(W) << index++ << "|";
printf("ccccccc");
while (n--)printf("c");
printf("\n");
}
void MOVE(int a, int b)//*3
{
PUSH(a);
PUSH(b);
COPY();
}
void DUL(int of)//*4
{
PUSH(0);
MOVE(1 - 1 + of, 2 - 1 + of);
}
void POP(int index)//*6
{
PUSH(0);
MOVE(index + 1, index);
ADD();
ADD();
}
int main()
{
//freopen("code.txt","w",stdout);
cerr << setfill('0');
LOAD();
DUL(1);
PUSH(0); MOVE(2, 3);
PUSH(1); MOVE(4, 2);
POP(4);
PUSH(1);
CMP();
PUSH(200);
JUMP();
POP(2);
DUL(1);
PUSH(0); MOVE(2, 3);
PUSH(1); MOVE(4, 2);
POP(4);
PUSH(2);
CMP();
PUSH(200);
JUMP();
POP(2);
PUSH(0); PUSH(1); PUSH(1);
PUSH(0);PUSH(0);//2
//printf("______________________\n");
MOVE(4,5);MOVE(3,6);//6
ADD();//1
MOVE(3,4);
MOVE(5,3);//3
PUSH(1);PUSH(0);//2
MOVE(1,7);//3
SUB();//1
MOVE(6, 1);//3
PUSH(2);//1
CMP();//1
PUSH(200);//1
JUMP();//1
PUSH(0);PUSH(1); PUSH(63);//2
JUMP();//1
return 0;
}