一个变态C/C++面试题的变态解法
这是源自某论坛的一个问题,原帖如下(#########分隔)
############################################################################
屏幕上打印1-1000这1000个数, 不许使用循环语句/条件语句,不许使用?:算符。
不许在源代码中用列举输出语句的办法傻打,比如一千个printf语句不行
一个cout后面跟上1-1000这样的也不行, 不再赘述其他傻打行为, 大家都能领会精神。
结果,出了好多千奇百怪的答案, 下面举一个例子
1 2 3 4 5 6 7 8 9 10 |
void myprint(int n) { printf("%d/n",n); int t=1/(n-1000); myprint(n+1); } void main() { myprint(1); } |
############################################################################
上面这个解法使用的是自动报错(divide by zero)从而退出,严格讲,这样的代码是错误的。
我在这里给两个正确的:
1. 使用函数指针数组
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#include <stdio.h> void dummy(int x) {} void myprint(int x) { void (*pfa[])(int) = {myprint, dummy}; printf("%d/n", x); pfa[x/1000](x+1); } int main(int argc, char* argv[]) { myprint(1); return 0; } |
2. 使用模板递归
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#include <stdio.h> template<int x> struct P { void prt() { printf("%d/n", 1000-x+1); P<x-1>().prt(); } }; template<> struct P<0> { void prt() {} }; int main(int argc, char* argv[]) { P<1000>().prt(); return 0; } |
=============================================
从网上搜出其他的解决办法:
1. 构造函数(也可以使用析构函数,一样的道理)
1 2 3 4 5 6 7 8 |
struct Printer { Printer() { static unsigned i=1; cout << i++ << endl;; } }; int main() { Printer p[1000]; } |
2. 最变态的一个(虽然代码不是很严格):
1 2 3 4 |
void main(int j) { printf("%d/n", j); (main + (exit - main)*(j/1000))(j+1); } |
大家可以大胆发挥想象力,寻求更变态的解决办法