码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-04-11 00:02:40      阅读:149      评论:0      收藏:0      [点我收藏+]

标签:递归   面试题   

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

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

标签:递归   面试题   

原文地址:http://blog.csdn.net/liao_jian/article/details/44986551

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!