每日一题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太大了,递归深度过大,使栈溢出将不能得到解答。而文章开头的第一种思路则和系统当时所能分配的空间大小决定,我认为这种思路的效率高于递归实现,因为递归实现其实也是在做++运算,加上递归的耗费,自然就慢了。

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