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

转自: http://blog.youkuaiyun.com/whinah/article/details/6130434


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

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

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

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

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

 

  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. 使用函数指针数组

  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. 使用模板递归

  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. 构造函数(也可以使用析构函数,一样的道理)

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

 

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

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

 

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值