输出1到最大n位数之间的所有数

比如

n = 2

那么从1一直输出到99

分析

直接输出,遇到大数时肯定有问题,比如n=100,存储100位的数据类型不存在。

可以利用数组来存储大数,比如n=100,可以开辟个数组 char a[101]

思路一

模拟现实中的技术方式,逢九进一

参考代码

#include <iostream>
#include <cstring>
using namespace std;

bool minuxOne(char *a, int *end_index, int size)
{
    if((*end_index == size - 1 && a[size - 1] == '0') || *end_index < 0 || *end_index >= size)
        return false;
    int tmp = size - 2;
    if(a[size - 1] != '0')
        --a[size -1];
    else
    {
        a[size - 1] = '9';
        while(1)
        {
            if(a[tmp] == '0')
            {
                a[tmp] = '9';
                --tmp;
            }
            else
            {
                --a[tmp];
                break;
            }
        }
        if(a[*end_index] == '0')
            ++*end_index;
    }
    return true;
}

bool printNum(const int size)
{
    if(size < 0)
        return false;
    char *a = new char[size];
    memset(a, '9', size);
    int end_index = 0;
    while(1)
    {
        if(end_index == size - 1 && a[size - 1] == '0')
            break;
        for(int i = 0; i < size; ++i)
        {
            if(end_index > i && a[i] == '0' )
                continue;
            cout << a[i];
        }
        cout << "\t";
        if(!minuxOne(a, &end_index, size))
            break;
    }
    delete []a;
    return true;
}

int main()
{
    int size = 5;
    printNum(size);
}
    

结果

思路二

本质可以看作是全排列,只是前边的0别输出

#include <iostream>
using namespace std;

bool print1ToMaxN(const int n);
bool print1ToMaxNRecursion(char *a, int size, int index);
bool printNum(char *a, int size);
int main()
{
    int size = 3;
    print1ToMaxN(size);
}
    
bool print1ToMaxN(const int size)
{
    if(size <= 0)
        return false;
    char *a = new char[size];
    for(int i = 0; i <= 9; ++i)
    {
        a[0] = i + '0';
        print1ToMaxNRecursion(a, size, 1);
    }
    return true;
}

bool print1ToMaxNRecursion(char *a, int size, int index)
{
    if(size <= 0 || index < 0)
        return false;
    if(index == size)
    {
        printNum(a, size);
        return true;
    }
    for(int i = 0; i <= 9; ++i)
    {
        a[index] = i + '0';
        print1ToMaxNRecursion(a, size, index + 1);
    }
}
    
bool printNum(char *a, int size)
{
    if(size <= 0)
        return false;
    bool IsPre0 = true;
    for(int i = 0; i < size; ++i)
    {
        if(IsPre0 && a[i] != '0')
            IsPre0 = false;
        if(!IsPre0)
            cout << a[i];
    }
    cout << "\t";
}

结果

分析

1. 输出问题:一开始为0不要输出,这需要输出时判断下

2. 递归全排列的本质原理:每一位字符0~0都有可能,在方位本位的时候递归遍历下一位。

posted @ 2014-03-18 10:08  jihite  阅读(2859)  评论(0编辑  收藏  举报