每日一题21:从0打印到具有n位整数的最大数

来源:互联网 发布:网络安全保密 标准 编辑:程序博客网 时间:2024/04/29 09:06

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

0 0
原创粉丝点击