135 条题解
- 
  -5
题解 - 【MX-A1】你好,梦熊 OJ!
这里我们推荐一种语言:Brainfuck,并用它来解决这个问题。
Brainfuck 的语法极其简单,它用 个控制符控制处于一个初始化为 的字符数组(字符采用 ASCII 码表示)上的一个指针来实现程序的运行。这 个控制符是:
控制符 含义 等价于 C++ 代码(指针为 p)+ 当前值加 ++*p;- 当前值减 --*p;> 指针加 ++p;< 指针减 --p;. 输出当前字符 putchar(*p);, 输入当前字符 *p=getchar();[ 当前值为 则跳转到对应的 ]while(*p){] 当前值非 则跳转到对应的 [}可以证明,Brainfuck 是图灵完备的。
根据题目描述,我们可以编写出本题的 Brainfuck 代码:
++++[>++++<-]>[>+++++>++++>++++++>+++>++<<<<<-]>>++++++++.>+++++.+++++++..+++.>----.>.<<<+++++.<++++++++.>++.-----.>>>+.可是, 梦熊不提供 Brainfuck 这个语言选项怎么办?
这里我们可以用 C++ 手写一个 Brainfuck 的解释器:
char s[10000],*p=s; char*run(char*c,bool i=0) { while(*c!='\0'&&*c!=']') { if(*c=='+') { if(!i)++*p; } else if(*c=='-') { if(!i)--*p; } else if(*c=='>') { if(!i)++p; } else if(*c=='<') { if(!i)--p; } else if(*c=='.') { if(!i)putchar(*p); } else if(*c==',') { if(!i)*p=getchar(); } else if(*c=='[') { if(i)c=run(c+1,1); else { char*t; if(!*p)t=run(c+1,1); while(*p)t=run(c+1); c=t; } } ++c; } return c; }把 Brainfuck 代码放进解释器里运行就好了。提交的代码如下:
#include<stdio.h> char s[10000],*p=s; char*run(char*c,bool i=0) { while(*c!='\0'&&*c!=']') { if(*c=='+') { if(!i)++*p; } else if(*c=='-') { if(!i)--*p; } else if(*c=='>') { if(!i)++p; } else if(*c=='<') { if(!i)--p; } else if(*c=='.') { if(!i)putchar(*p); } else if(*c==',') { if(!i)*p=getchar(); } else if(*c=='[') { if(i)c=run(c+1,1); else { char*t; if(!*p)t=run(c+1,1); while(*p)t=run(c+1); c=t; } } ++c; } return c; } int main() { char code[]="++++[>++++<-]>[>+++++>++++>++++++>+++>++<<<<<-]>>++++++++.>+++++.+++++++..+++.>----.>.<<<+++++.<++++++++.>++.-----.>>>+."; run(code); return 0; } 
信息
- ID
 - 1
 - 时间
 - 1000ms
 - 内存
 - 512MiB
 - 难度
 - 1
 - 标签
 - (无)
 - 递交数
 - 3347
 - 已通过
 - 1645
 - 上传者