一个变态C/C++面试题的变态解法

来源:互联网 发布:mac的pages怎么转word 编辑:程序博客网 时间:2024/04/29 18:47

转自: http://blog.csdn.net/whinah/article/details/6130434


这是源自某论坛的一个问题,原帖如下(#########分隔)

############################################################################

屏幕上打印1-1000这1000个数, 不许使用循环语句/条件语句,不许使用?:算符。
不许在源代码中用列举输出语句的办法傻打,比如一千个printf语句不行

一个cout后面跟上1-1000这样的也不行, 不再赘述其他傻打行为, 大家都能领会精神。

结果,出了好多千奇百怪的答案, 下面举一个例子

 

view plain
  1. void myprint(int n)  
  2. {  
  3.         printf("%d/n",n);  
  4.         int t=1/(n-1000);  
  5.         myprint(n+1);  
  6. }  
  7. void main()  
  8. {  
  9.         myprint(1);  
  10. }  

 

############################################################################


上面这个解法使用的是自动报错(divide by zero)从而退出,严格讲,这样的代码是错误的。

我在这里给两个正确的:


1. 使用函数指针数组

view plain
  1. #include <stdio.h>  
  2.    
  3. void dummy(int x) {}  
  4. void myprint(int x)  
  5. {  
  6.         void (*pfa[])(int) = {myprint, dummy};  
  7.         printf("%d/n", x);  
  8.         pfa[x/1000](x+1);  
  9. }  
  10.    
  11. int main(int argc, char* argv[])  
  12. {  
  13.         myprint(1);  
  14.         return 0;  
  15. }  
 

 

2. 使用模板递归

view plain
  1. #include <stdio.h>  
  2. template<int x> struct P {  
  3.         void prt() {  
  4.                 printf("%d/n", 1000-x+1);  
  5.                 P<x-1>().prt();  
  6.         }  
  7. };  
  8. template<> struct P<0> { void prt() {} };  
  9. int main(int argc, char* argv[])  
  10. {  
  11.         P<1000>().prt();  
  12.         return 0;  
  13. }  
 

 

=============================================

从网上搜出其他的解决办法:

1. 构造函数(也可以使用析构函数,一样的道理)

view plain
  1. struct Printer  
  2. {  
  3.     Printer() { static unsigned i=1; cout << i++ << endl;; }  
  4. };  
  5. int main()  
  6. {  
  7.     Printer p[1000];  
  8. }  
 

 

2. 最变态的一个(虽然代码不是很严格):

view plain
  1. void main(int j) {  
  2.     printf("%d/n", j);  
  3.     (main + (exit - main)*(j/1000))(j+1);  
  4. }  
 

 

大家可以大胆发挥想象力,寻求更变态的解决办法