ZOJ 3952 Fibonacci Sequence Chicken Edition 新构造语言,思路转换

文章目录


题目链接

题意

给你一种只由字符’c’组成的语言,用这种语言编写一个计算斐波那契数列第n项的程序.
该程序结构体包括一个由1开始编号的栈,可进行7种操作,具体请看题面.

题解

首先还是研究如何产生斐波那契数列.
可以想到的办法是将斐波那契数列的前30项放在栈的前30项,输入n之后直接将第n项复制到第31项即可.
那么事不宜迟,马上来写.很明显第2,3,6三种操作是不需要使用的.
具体直接看代码.

void print(int n) { //输出n个c
  char op[999]={0};
  for (int t=1;n--;op[t++]='c');
  puts(op+1);
}
void push(int x) { // 第七种操作,输入x
  print(x+7);
}
void add() {
  print(1);
}
void load() {
  print(4);
}
void copy(int x,int y) {
  push(x),push(y);
  print(5);
}
int main() {
  push(1),push(1); //先在栈里输入两个1
  for (int i=3;i<=30;++i) {
    push(1),push(1); // 随便输入两个数占位置
    copy(i-2,i),copy(i-1,i+1); //将倒数第二项和倒数第一项复制过来
    add(); // 执行加法操作,相加的两个数会被丢掉,放进来的那个数就是f(n+2).
  }
  push(1); // 随便输入一个数占第31个位置
  load();
  push(31);
  print(5); // 将第n项复制到第31项,可以看到这时的栈顶元素就是第31项,也即我们需要的答案.
}

谢谢大家.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值