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项,也即我们需要的答案.
}

谢谢大家.

猜你喜欢

转载自blog.csdn.net/qq_31908675/article/details/108876936