每日一題21:從0打印到具有n位整數的最大數

該題目的難點在於n可能很大,超過了整數表示的範圍,所以一般有兩種思路,一種是用字符串表示整數,並實現++操作符,另一種是把該題目當做排列組合來做,使用遞歸可以實現,下面給出使用遞歸實現的代碼:

void __print(char digit_array[], int index, int n)
{
    if (index < 0) return;
    if (index == n - 1)
    {
        digit_array[index] = '0';
        //從0開始
        for (int i = 0; i < 10; ++i)
        {
            digit_array[index] = i + '0';
            cout << digit_array << endl;
        }
        return;
    }
    //這是爲了在打印是不會像出現0012這樣的情況,
    //但是又要保證像1002這種情況的出現。
    //整個字符數組開始使用‘ ’(空格)初始化的
    if (digit_array[index] != ' ')
        digit_array[index] = '0';
    __print(digit_array, index + 1, n);
    //從1開始,該位爲0時,由上一句負責
    for (int i = 1; i < 10; ++i)
    {
        digit_array[index] = i + '0';
        __print(digit_array, index + 1, n);
    }
}
void PrintN(int n)
{
    char *digit_array = new char[n + 1];
    for (int i = 0; i < n; ++i)
    {
        digit_array[i] = ' ';
    }
    digit_array[n] = '\0';
    //從第一位開始遞歸
    __print(digit_array, 0, n);
    delete[]digit_array;
}

測試代碼:

#include "stdafx.h"
#include <iostream>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    PrintN(4);
    return 0;
}

程序運行截圖:
這裏寫圖片描述
使用遞歸可以打印出很大的數,具體和系統分配的棧空間大小有關,n太大了,遞歸深度過大,使棧溢出將不能得到解答。而文章開頭的第一種思路則和系統當時所能分配的空間大小決定,我認爲這種思路的效率高於遞歸實現,因爲遞歸實現其實也是在做++運算,加上遞歸的耗費,自然就慢了。

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