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

题意

让你用汇编实现求斐波那契第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;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值