• 解题:不用循环、递归,如何从 1 打印到 100?(8月10日更新)

    2016/08/04 伯小乐 53 评论

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

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

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

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

Mark Gordon, ICPC 2011 Gold Medalist (msg555)

第一种:

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

第三种:

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

第五种:Advanced preprocessor bashing

Divye Kapoor 的补充:

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

第六种:Using the alarm system call.

第七种:Using fread and fwrite

第八种:Using queued SIGUSR calls

第九种:Memory mapping a file

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

第十种:The standard template metaprogram

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

其他方案可参见 Quora 帖子:https://www.quora.com/How-can-I-print-1-to-100-in-C++-without-a-loop-goto-or-recursion

4 7 收藏


直接登录
最新评论
  •  

  • 水中月 程序员--前端coder 2016/08/04

    这道题目js是有解的。(首选说明一下可能还有其他的方式)

    我的想法是可行,但是不同浏览器可能稍有差异

    代码如下:

    var  arr= new Array(100);(产生一个长度为100的数组;)

    arr.toString().split(“”).map(function(item,index,arr){return index+1});

    说明一下为什么要arr.toString().split(“”) 而不是直接arr.map;

    直接arr.map产生了一个长度为100的数组,但是每一项都是undefined;

    所以直接.map方法不会被执行;

    所以 arr.toString().split(“”) 产生一个长度100(不同浏览器不太一样有可能是99,这个问题《js高级程序设计》那本书里面有介绍的)每一项都是”,”的数组;

    然后map遍历每一项返回当前项index+1(因为数组下标是从0开始的);

    so :

    dd.toString().split(“”).map(function(item,index,arr){return index+1});
    [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100]

  • 还是python来的快

    print range(1,101)

  • 梯恩梯   2016/08/05

    两个函数相互调用算吗?

  • Tean BUG生成器 2016/08/05

     

    class Ptr

    Ptr next;

    int value;

    func print() {

    printf(value);

    if(value<100)

    next = Ptr(value+1)

    next.print()

    }

     

    Ptr(1).print()

    其实这种应该还是算递归

    •   2016/08/08

      递归要压栈,两个函数相互调用不压栈,不会造成栈溢出。从这个意义上讲,他们不一样吧

  • dragon434 高级运维工程师 2016/08/05

    echo {1..100}

  • 抖机灵有意思?

  • 星空少儿编程俱乐部 少儿编程培训教师 2016/08/06

    用python很简单的,print(list(range(1,101)))

  • 诸葛不亮 Qt/C++程序员 2016/08/06

    #define printN(n) if(n>0){printf(“%d\n”,n);printN((n-1))}

    printN(100);

     

    我可没递归,宏在编译期就展开了

     

  • NakedFaces   2016/08/06

    用模版解(其实还是递归)

     

    • fd5788 程序猿 2016/08/10

      看不懂啊,不是template<class T>吗?怎么可以用int

      • NakedFaces   2016/08/15

        模版参数可以是类型,也可以是非类型

        Each parameter in parameter-list may be:
        a non-type template parameter;
        a type template parameter;
        a template template parameter.

         

        type is one of the following types (optionally cv-qualified, the qualifiers are ignored):
        std::nullptr_t (since C++11);
        integral type;
        lvalue reference type (to object or to function);
        pointer type (to object or to function);
        pointer to member type (to member object or to member function);
        enumeration type.

  • 如果模板和宏展开也算是递归,那也可以不用:

    #include <iostream>

    void p(int n) { if(n < 100) std::cout<<n+1<<std::endl; }

    void p0(int n) { p(n); p(n+(1<<0)); }

    void p1(int n) { p0(n); p0(n+(1<<1)); }

    void p2(int n) { p1(n); p1(n+(1<<2)); }

    void p3(int n) { p2(n); p2(n+(1<<3)); }

    void p4(int n) { p3(n); p3(n+(1<<4)); }

    void p5(int n) { p4(n); p4(n+(1<<5)); }

    void p6(int n) { p5(n); p5(n+(1<<6)); }

    void p7(int n) { p6(n); p6(n+(1<<7)); }

    int main() { p7(0); return 0; }

  • dangerman   2016/08/06

    std::cout << “1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,(后面略)” << std::endl;

  • Java 2016/08/07

    #include <iostream>
    using namespace std;

    int main(){
    std::cout << “1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100” << std::endl;
    return 0 ;
    }

  • 国外大牛已经提问和解答过,https://www.quora.com/Algorithms/How-can-I-print-1-to-100-in-C%2B%2B-without-a-loop-goto-or-recursion

    感觉比较好的方式是这个:

    #include<iostream>

    using namespace std;

    class A
    {
    public:
    static int a;

    A()
    {
    cout<<a++<<endl;
    }
    };

    int A::a = 1;

    int main()
    {
    A obj[100];
    return 0;
    }

  • 第一种 模板元编程

    第二种 c++函数指针 加数组

    第三种 c++ 类数组

    这不跟求1+。。。+n一样吗

  • 伯小乐 小编 2016/08/10

    更新补充了 11 种方案 :)

  • 龙雀 野生程序员 2016/08/15

    我为什么首先想到了模板元编程。。(手动笑cry)

  • wingc   2016/08/16

    1.just system call seq. no big deal.
    2.use alloca to allocate memory from stack to rptr, and then in the end of foo, write foo’s address back to rptr which is the return address, so foo returns back to foo to continue output until 100. of course it could not run other systems because this is a hack on stack return address.
    3.fork 2^6 child processes, each of them uses x to track and output. but the order cannot be guaranteed.
    4.use of macro to expand to be parameters of printf
    5.another use of macro that conditionally includes source file itself
    6.SIGALRM signals continuously to output
    7.SERIOUSLY? Just read 1,2,…10 from a file to output?
    8.Queued SIGUSR signals
    9.SERIOUSLY? Still read and output from a file. Ok, mmap, so what?
    10.C++ template meta-programming
    11.C++ static class member, output during object’s consturcting, and array of objects

  • 快到碗里来 程序猿 2016/08/18

    我想问一下,实际开发中会用到这个吗

  • 不错 学习了  模板还不太会用

  • 归根结底,将复杂度隐藏给外部系统,这是考对系统的熟悉程度吧

  • Remixˉ   2016/12/11

    python 2

  • 可健康了 程序员 2016/12/12

    虽然题目无聊,还是答一下吧,看看谁用的字符比我少,一共13个,哈哈

     

  • commuter   2016/12/14

    class pt;

    pt* ptbase = NULL;

    class pt{

    public:

    int i;

    pt(){

    if(ptbase==NULL){

    ptbase = this;

    }

    printf(“%d\n”,this-ptbase+1);

    }

    };

    int main(){

    new pt[100];

    delete[] ptbase;

    system(“pause”);

    return 0;

    }

  • Rain   2016/12/21