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