[转]输出从1到1000的数,不能使用循环和条件语句

有这样一个面试题——请把从1到1000的数打印出来,但你不能使用任何的循环语句或是条件语句。更不能写1000个printf或是cout用C/C++语言

  我相信,大多数人一开始你可能想到的是递归算法:

  void f( int n){

       printf ( "%d/n" ,n);

       1000-n ? f(n+1): return ;

  }

  int main(){

  f(1);

  }

  当然,题目中说了不能使用条件语句,所以,上面那种解法的不符合题意的,因为还是变向地使用了条件表达式。不过,我们可以用别的方法来让这个递归终止,比如:

  除以零,当程序crash,呵呵。

  void f( int n){

       printf ( "%d/n" ,n);

       n/1000-n;

       f(n+1);

  }

  还有这样退出递归的:

  void yesprint( int i);

  void noprint( int i);

  typedef void (*fnPtr)( int );

  fnPtr dispatch[] = { yesprint, noprint };

  void yesprint( int i) {

       printf ( "%d/n" , i);

       dispatch[i / 1000](i + 1);

  }

  void noprint( int i) { /* do nothing. */ }

  int main() {

         yesprint(1);

  }

  还有下面这些各种各样的解法:

  #include<stdio.h>

  /* prints number  i */

  void print1( int i) {

       printf ( "%d/n" ,i);

  }

  /* prints 10 numbers starting from i */

  void print10( int i) {

       print1(i);

       print1(i+1);

       print1(i+2);

       print1(i+3);

       print1(i+4);

       print1(i+5);

       print1(i+6);

       print1(i+7);

       print1(i+8);

       print1(i+9);

  }

  /* prints 100 numbers starting from i */

  void print100( int i) {

       print10(i);

       print10(i+10);

       print10(i+20);

       print10(i+30);

       print10(i+40);

       print10(i+50);

       print10(i+60);

       print10(i+70);

       print10(i+80);

       print10(i+90);

  }

  /* prints 1000 numbers starting from i */

  void print1000( int i) {

       print100(i);

       print100(i+100);

       print100(i+200);

       print100(i+300);

       print100(i+400);

       print100(i+500);

       print100(i+600);

       print100(i+700);

       print100(i+800);

       print100(i+900);

  }

  int main() {

           print1000(1);

           return 0;

  }

  不过,print用得多了一些。我们可以用宏嘛。

  #include

  #define Out(i)       printf("%d/n", i++);

  #define REP(N)       N N N N N N N N N N

  #define Out1000(i)   REP(REP(REP(Out(i))));

  void main()

  {

       int i = 1;

       Out1000(i);

  }

  不过,我们应该使用C++的一些特性,比如:

  使用构造函数

  class Printer

  {

  public :

       Printer() { static unsigned i=1; cout << i++ << endl;; }

  };

  int main()

  {

       Printer p[1000];

  }

  或是更为NB的Template:

  template < int N>

  struct NumberGeneration{

       static void out(std::ostream& os)

       {

           NumberGeneration<N-1>::out(os);

           os << N << std::endl;

       }

  };

  template <>

  struct NumberGeneration<1>{

       static void out(std::ostream& os)

       {

           os << 1 << std::endl;

       }

  };

  int main(){

       NumberGeneration<1000>::out(std::cout);

  }

  最后来个BT一点的:

  void main( int j) {

       printf ( "%d/n" , j);

       (main + ( exit - main)*(j/1000))(j+1);

  }

  本文来自: http://stackoverflow.com/q/4568645/89806

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值