首页 > 其他 > 详细

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

时间:2019-07-28 14:59:29      阅读:66      评论:0      收藏:0      [点我收藏+]

/////////////////////////////////////////////////////////////////////////////////////
// 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;


}

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

原文:https://www.cnblogs.com/yzdai/p/11258691.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!