ZOJ 3952 Fibonacci Sequence Chicken Edition
题目链接
题意
当我读第一遍题时,心态是崩溃的。。。
好吧,不多废话。
其实就是让你编一个程序来输出另一个程序源码。(禁止套娃)
另一个程序就是题中的Chicken Language。
你编的程序输出的每一行 ‘c’ 的数量就是Chicken Language的一个操作码,有多少行输出便有多少个操作码。
这时你会想这和斐波那契数列有啥关系,其实就是通过操作码来算出斐波那契数列第n个数的值(n≤30且n≥1)。
思路
初始化 f(-1) = 1 , f(0) = 0 ,然后进入循环;
每次循环开始时的状态为 stack[1]存储剩下的循环次数,stack[2]存储 f(n-2) , stack[3]存储 f(n-1);
循环的操作:
操作 | 操作码 |
---|---|
copy stack[2] to stack[4] | 7 9 11 5 |
copy stack[3] to stack[2] | 10 9 5 |
Add 相当于 stack[3] = stack[3]+stack[4] | 1 |
push 1 相当于 stack[4] = 1 | 8 |
copy stack[1] to stack[5] | 7 8 12 5 |
Subtract 相当于 stack[4] = stack[5] - stack[4] | 2 |
copy stack[4] to stack[1] | 11 8 5 |
push 1 相当于 stack[5] = 1 | 8 |
Compare 相当于 stack[4] = (stack[4]==stack[5]) | 3 |
push 40 (一个大于操作码个数的值,用于程序stop) 相当于 stack[5] = 40 | 47 |
Jump (如果stack[4]==0,弹出stack[4]和stack[5];如果stack[4]==1,弹出stack[4]和stack[5],程序stop,此时stack[3]的值就是结果) | 6 |
Jump 程序跳转到循环体开始 | 8 19 6 |
代码
一共用了27个操作码,如果你可以用的更少,请忽略这篇题解
#include<cstdio>
void print(int x){
for(int i=0;i<x;i++){
printf("c");
}
printf("\n");
}
int main(){
print(4);//读入一个数,作为循环次数
print(8);//初始化f(-1) = 1
print(7);//初始化f(0) = 0
print(7);//循环体开始
print(9);
print(11);
print(5);
print(10);
print(9);
print(5);
print(1);
print(8);
print(7);
print(8);
print(12);
print(5);
print(2);
print(11);
print(8);
print(5);
print(7);
print(3);
print(47);
print(6);
print(8);
print(11);
print(6);//循环体结束
return 0;
}