题目12 打印1到最大的n位数

/////////////////////////////////////////////////////////////////////////////////////
// 2.打印1到最大的n位数

// 2.1 方法一:当N很大时,会有溢出问题!!!!
void Print1ToMaxOfDigits_1(int iLen)
{
    int iNumber = 1;
    while (iLen > 0)
    {
        iNumber *= 10;
        iLen--;
    }

    for (int i = 1; i < iNumber; i++)
    {
        if (i % 20 == 0 && i != 0)
        {
            putchar(10);
        }
        printf("%3d ", i);
    }
    putchar(10);
}

// 2.2 方法二:字符串上模拟数字加法
bool Increment(char* pszBuff)
{
    bool bOverFlow = false;
    int iTakeOver = 0;          // 进位
    int iLen = strlen(pszBuff);

    for (int i = iLen - 1; i >= 0; i--)
    {
        int iSum = pszBuff[i] - '0' + iTakeOver;

        // 这里什么作用??? --> ++功能???
        if (i == iLen - 1)
        {
            iSum++;
        }

        if (iSum >= 10)
        {
            // 退出循环条件!!! 
            if (i == 0)
            {
                bOverFlow = true;
            }
            else
            {
                iSum -= 10;
                iTakeOver = 1;
                pszBuff[i] = '0' + iSum;
            }
        }
        else
        {
            pszBuff[i] = '0' + iSum;
            break;
        }
    }

    return bOverFlow;
}

void PrintNumber(char* pszBuff)
{
    bool bZero = true;
    int iLen = strlen(pszBuff);

    for (int i = 0; i < iLen; i++)
    {
        // 不打印字符串前面的0
        if (bZero && pszBuff[i] != '0')
        {
            bZero = false;
        }

        if (!bZero)
        {
            printf("%c", pszBuff[i]);
        }
    }
}

void Print1ToMaxOfDigits_2(int iLen)
{
    if (iLen <= 0)
    {
        return;
    }

    char* pszBuff = new char[iLen + 1];
    memset(pszBuff, '0', iLen);
    pszBuff[iLen] = '\0';
    int iPrintLen = 0;

    while (!Increment(pszBuff))
    {
        PrintNumber(pszBuff);
        printf(" ");
        iPrintLen++;
        if (iPrintLen % 20 == 0 && iPrintLen != 0)
        {
            putchar(10);
        }
    }

    putchar(10);

    // 释放内存
    delete[] pszBuff;
    pszBuff = NULL;

}


// 2.3 把问题转换成数字排列的解法
static int s_PrintNum = 0;
void Print1ToMaxOfDigitsRecursion(char* pszBuff, int iLen, int iIndex)
{
    if (iIndex == iLen - 1)
    {
        PrintNumber(pszBuff);
        printf(" ");
        s_PrintNum++;
        if (s_PrintNum % 20 == 0)
        {
            putchar(10);
        }

        return;
    }

    for (int i = 0; i < 10; i++)
    {
        pszBuff[iIndex + 1] = i + '0';
        Print1ToMaxOfDigitsRecursion(pszBuff, iLen, iIndex + 1);
    }
}

void Print1ToMaxOfDigits_3(int iLen)
{
    if (iLen <= 0)
    {
        return;
    }

    char* pszBuff = new char[iLen + 1];
    pszBuff[iLen] = '\0';

    for (int i = 0; i < 10; i++)
    {
        pszBuff[0] = i + '0';
        Print1ToMaxOfDigitsRecursion(pszBuff, iLen, 0);
    }

    putchar(10);

    // 释放内存
    delete[] pszBuff;
    pszBuff = NULL;
}

void Print1ToMaxOfDigitsTestFunc()
{
    cout << "\n\n --------------- Print1ToMaxOfDigitsTestFunc Start -------------->" << endl;
    int iNum = 2;

    cout << "方法一: " << endl;

    Print1ToMaxOfDigits_1(iNum);

    cout << "方法二: " << endl;
    Print1ToMaxOfDigits_2(iNum);

    cout << "方法三: " << endl;
    Print1ToMaxOfDigits_3(iNum);

    cout << "\n\n --------------- Print1ToMaxOfDigitsTestFunc End -------------->" << endl;


}
posted @ 2019-07-28 13:35  VIP丶可乐  阅读(126)  评论(0编辑  收藏  举报