從1到1000的數打印出來

有這樣一個面試題——請把從1到1000的數打印出來,但你不能使用任何的循環語句或是條件語句。更不能寫1000個printf或是cout。用C/C++語言。

我相信,大多數人一開始你可能想到的是遞歸算法:

void f(int n){
    printf("%d/n",n);
    (1000-n) ? f(n+1) : exit(0) ;
}
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<stdio.h>
#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);
}
class PrintNum
{
public:
        static int count;
        PrintfNum(){printf("%d/n", count); count++;}
}
//------------------------
int main()
{
        PrintfNum::count = 1;
        PrintfNum pn[1000];
        return 0;
}


最後來個BT一點的:

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章