解题:不用循环、递归,如何从 1 打印到 100(转)

来源:伯乐在线 - 伯小乐

链接:http://group.jobbole.com/22100/


在 Quora 上看到有个程序员的提问:

如果不用循环、递归、goto,我如何才能用 C++ 从 1 打印到 100 ?

原题主问的是用 C++ 来实现。

【2016-08-10 更新】:补充国外程序员的一些方案:

Mark Gordon, ICPC 2011 Gold Medalist (msg555)

第一种:

#include <stdlib.h>

intmain(){

  /* Cross your fingers and hope seq exists! */

  returnsystem("seq 1 100");

}

第二种:下面这个方案在我电脑上没问题,但不保证你们电脑上也OK

#include <iostream>

#include <stdlib.h>

intnum;

void(**rptr)();

voidfoo(){

  if(num >= 100)exit(0);

  std::cout << ++num << std::endl;

  *rptr++ = foo;

}

intmain(){

  rptr = (void(**)())alloca(sizeof(*rptr) * 200) - 1;

  foo();

  return0;

}


第三种:


#include <iostream>

#include <stdlib.h>

intmain(){

  intx = 0;

  x |= !fork() << 0;

  x |= !fork() << 1;

  x |= !fork() << 2;

  x |= !fork() << 3;

  x |= !fork() << 4;

  x |= !fork() << 5;

  x |= !fork() << 6;

  if(1 <= x && x <= 100)std::cout << x << std::endl;

  return0;

}

第四种:similar to bashing templates you can bash the preprocessor


#include <stdio.h>

#define F4 "%dn%dn%dn%dn"

#define F20 F4 F4 F4 F4 F4

#define F100 F20 F20 F20 F20 F20

#define X4(y) , y, y + 1, y + 2, y + 3

#define X20(y) X4(y) X4(y + 4) X4(y + 8) X4(y + 12) X4(y + 16)

#define X100(y) X20(y) X20(y + 20) X20(y + 40) X20(y + 60) X20(y + 80)

intmain(){

  printf(F100 X100(1));

  return0;

}

第五种:Advanced preprocessor bashing


#if (__COUNTER__ == 0)

#include <stdio.h>

intmain(){

  #include __FILE__

  return0;

}

#elif (__COUNTER__ < 300)

printf("%dn",__COUNTER__ / 3);

#include __FILE__

#endif


Divye Kapoor 的补充:


Mark Gordon 给出了一些非常好的方案,我也来补充一些


第六种:Using the alarm system call.


#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

#include <sys/types.h>

#include <signal.h>

inti = 0;

voidsig_alarm_handler(intsignal){

    ++i;

    printf("%dn",i);

    if(i < 100)

        alarm(1);

    else

        exit(0);

}

intmain(){

    signal(SIGALRM,sig_alarm_handler);

    alarm(1);

    intx;

    scanf(" %d",&x);

    return0;

}


第七种:Using fread and fwrite


#include <stdlib.h>

#include <stdio.h>

intmain(){

    FILE*fd = fopen("data.txt","r");

    charbuf[10000];

    size_tn = fread(buf,sizeof(char),10000,fd);

    fwrite(buf,sizeof(char),n,stdout);

    fflush(stdout);

    fclose(fd);

    return0;

}


第八种:Using queued SIGUSR calls


#include <stdio.h>

#include <stdlib.h>

#include <assert.h>

#include <string.h>

#include <sys/types.h>

#include <unistd.h>

#include <signal.h>

intmypid;

voidsignal_handler(intsignal,siginfo_t*siginfo,void*extra){

    printf("%dn",siginfo->si_int);

    sigval_tsignal_value;

    memcpy(&signal_value,&siginfo->si_value,sizeof(signal_value));

    ++signal_value.sival_int;

    if(signal_value.sival_int <= 100)

        sigqueue(mypid,SIGUSR1,signal_value);

    else

        exit(0);

}

intmain(){

    mypid = getpid();

    structsigactionsa;

    bzero(&sa,sizeof(sa));

    sa.sa_sigaction = signal_handler;

    sa.sa_flags = SA_SIGINFO | SA_NODEFER | SA_RESTART;

    sigaction(SIGUSR1,&sa,NULL);

    sigval_tsignal_value;

    signal_value.sival_int = 1;

    sigqueue(mypid,SIGUSR1,signal_value);

    sleep(1000);

    return0;

}


第九种:Memory mapping a file


#include <stdio.h>

#include <stdlib.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <sys/mman.h>

#include <fcntl.h>

#include <unistd.h>

intmain(){

    intfd = open("data.txt",O_RDONLY);

    structstatstat_data;

    fstat(fd,&stat_data);

    off_tfile_size = stat_data.st_size;

    // Memory map the file

    void*baseaddr = mmap(NULL,file_size,PROT_READ,MAP_PRIVATE,fd,0);

    // Copy the memory mapped region to stdout

    fwrite((char*)baseaddr,sizeof(char),file_size,stdout);

    fflush(stdout);

    // Unmap the memory mapped region

    munmap(baseaddr,file_size);

    // Close the file

    close(fd);

    return0;

}


下面这这些,我看其他网友也有提到,但发现可以优化一下


第十种:The standard template metaprogram


#include <stdio.h>

template<intN>

structX : X<N-1>{

    X(){printf("%dn",N);}

};

template<>

structX<0>{};

intmain(){

    X<100>x;

    return0;

}


第十一:用静态变量和数组


#include <stdio.h>

structX{

    staticinti;

    X(){ ++i;printf("%dn",i);}

};

intX::i = 0;

intmain(){

    Xarr[100];

    return0;

}


  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值