zoj - 3952

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] = 18
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] = 18
Compare 相当于 stack[4] = (stack[4]==stack[5])3
push 40 (一个大于操作码个数的值,用于程序stop) 相当于 stack[5] = 4047
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;
} 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值