偶尔看到的一道题,和哥们几个讨论了一下,这玩意,不是循环就是递归了么,当然,只要达到目的,管他什么循环递归,对吧。现在总结一下我们能想到的所有的方法,大家有新的想法欢迎跟帖讨论~~
ok,开工。
第一条,最简单的,直接输出。(因为输出结果都差不多,就不一个一个截图了)
printf("5 4 3 2 1\n");
第二条,简单的循环。
// for 循环 for(int =5; i !=0; i--) { printf("%d\n",i); } // while 循环 int i=6; while(--i){ printf("%d\n",i); } // do while 循环 int i=5; do{ prinf("%d\n",i); }while(--i);
三,递归。现在基本循环是讲完了,来讨论一下递归吧,先来个简单点的。
#include <stdio.h> void print(int i) { if(i){ printf("%d\n",i); print(--i); } } int main() { print(5); return 0; }
然后另一哥们呵呵一笑,来了个短路递归。
#include <stdio.h> int print(int n) { printf("%d\n",n); --n && print(n); } int main() { print(5); return 0; }
四,c++上场。群里有个用c++的哥们不服了,也来了一段类的构造。
// c++ #include <iostream> class A{ public : static int n; A(){std::cout<<n--<<std::endl;} }; int A::n=5; int main() { new A[5]; return 0; }
版主说你们这群渣渣,看哥儿给你们耍耍模版。
#include <iostream> using namespace std; template <int T> class F: public F<T+1> { public: F(){cout << T << " ";} }; template <> class F<6> { }; int main() { F<1> fu; cout<<endl; return 0; }
五,递归从新归来。看大家这么热闹,我也想写一个,但是c++又不熟练,突然想起gcc的一个特性,main也可以递归啊
// gcc 通过,vs不行,clang 报两个警告 #include <stdio.h> #include <stdlib.h> void main(int i) { printf("%d\n", 6-i); (&main + (&exit - &main)*(i/5))(i+1); }
六、汇编+开挂。然后一个汇编大牛说话了,你们BB什么,哥儿写的代码你们都看不懂,然后洋气的甩我们一张截图。
// 这个在gcc下编译失败 #include "stdio.h" int main(){ __asm{ push esi mov esi,0x31 buhaha: push esi call putchar push 0x0a call putchar add esp,8 inc esi cmp esi,0x36 jne buhaha pop esi } return 0; }
我们一致讨论说这个算开挂,不能作数,大神不耐烦又补上两行代码
这下大家都没话说了。。。。。
你以为这就完了,当然没有,
我们还没反应过来,大神又说话了,哥儿不用汇编也能开挂,呵呵。
// gcc 下编译成功,运行出现段错误 #include <stdio.h> typedef void (*hehe)(); int main(){ static char a[]={0x56, 0x57, 0xBF, 0x78, 0x56, 0x34, 0x12, 0xBE, 0x31, 0x00,0x00, 0x00, 0x56, 0xFF, 0xD7, 0x6A, 0x0A, 0xFF, 0xD7, 0x83,0xC4, 0x08, 0x46, 0x83, 0xFE, 0x36, 0x75, 0xF0, 0x5F, 0x5E, 0xC3}; *(unsigned long *)(&a[3])=(unsigned long)putchar; ((hehe)(&a[0]))(); }
大家都不说话了。。。。。。
总结:说了这么多c/c++的方法,其他语言肯定也有更“变态”的方法,平时遇到一个问题时可能我们一个人思路有限,但是和大伙交流一下,总能有各种各样的解决方案,所以,不要吝啬你们的解题方法,拿出来大家交流一下吧 :)