17th浙大校赛 ZOJ3952 Fibonacci Sequence Chicken Edition【汇编】

题意

让你用汇编实现求斐波那契第n项(n<=30)

思路

比赛时按正常思路想了好写了一发WA了,然后突然想到能不能写30个if,兴冲冲写完WA了,看了遍题目才发现有10^4字数限制,白白浪费半小时。后来实在找不到bug,现场写了个模拟编译器来运行了下,发现运行行数超过限制了(汇编代码写太丑,吃了学校没开汇编课的亏),但是当时时间就剩10分钟了,根本来不及优化,不得已作罢。回去后优化了15分钟就AC了,欲哭无泪。

AC代码

#include 
#include 
#include 
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;
}

你可能感兴趣的:(ZOJ)