打印1到最大的N位数

问题描述:

输入数字n,按顺序打印出从1到最大的n位十进制数。比如输入3打印出1-999.

思路分析:

最简单的想法莫过于先算出这个最大的数,然后循环打出,但是没有考虑大溢出和大数问题。

下面有两种思路,一个是用数组模拟字符串,一种是用排列组合的方法。

参考代码:

思路一:字符串上模拟数字加法

bool Increment(char *number)//实现在数字字符串上+1
{
    bool isOveflow = false;//判断最高位时候溢出
    int nTakeover = 0;//保存进位
    int nLength = strlen(number);

    for (int i = nLength-1;i >= 0;i--)
    {
        int nSum = number[i]-'0'+nTakeover;
        if (i == nLength-1)//最低位
        {
            nSum++;
        }

        if (nSum >= 10)
        {
            if (i == 0)
            {
                isOveflow = true;
            }
            else
            {
                nSum -=10;
                nTakeover = 1;
                number[i] = nSum+'0';
            }
        }
        else
        {
            number[i] = nSum+'0';
            break;
        }
    }
    return isOveflow;
}

void PrintNumber(char *number)
{
    int nLength = strlen(number);
    int isZero = true;

    for (int i = 0; i < nLength;i++)
    {
        if (isZero && (number[i] != '0'))//从高位开始,找到第一个非0数后将标志设为false
        {
            isZero = false;
        }
        if (!isZero)
        {
            cout<<number[i];
        }
    }
    cout<<endl;
}

void Print1ToMaxNDigits(int n)
{
    if (n <= 0)
    {
        return;
    }
    char *number = new char[n+1];
    memset(number,'0',n);
    number[n] = '';

    while (!Increment(number))
    {
        PrintNumber(number);
    }

    delete [] number;
    number = NULL;
}

思路二:将问题转换为数字排列的方法

void Print1ToMaxNDigits2(int n)
{
    if (n < 0)
    {
        return ;
    }
    char *number = new char[n+1];
    memset(number,'0',n);
    number[n] = '';
    Print1ToMaxNDigitsRecur(number,n,0);

    delete [] number;
    number = NULL;
}

void Print1ToMaxNDigitsRecur(char *number,int nLength,int nIndex)
{
    if (nIndex == nLength)//已经排列到了最后一位就打印
    {
        PrintNumber(number);
        return;
    }
    for (int i = 0;i < 10;i++)
    {
        number[nIndex] = i+'0';
        Print1ToMaxNDigitsRecur(number,nLength,nIndex+1);
    }
}

原文地址:https://www.cnblogs.com/Mr-Zhong/p/4162271.html