【剑指offer】面试题12:打印1到最大的n位数

整体结构

void Print1ToMaxOfDigits(int n)
{
    if (n <=0)//对于n=0也需要限制,因为无法跳出循环,造成死循环
    {
        return;
    }
    char *number = new char[n + 1];
    memset(number, '0', n + 1);
    number[n] = '\0';

    while (!Increment(number))//当空间第一位进位时,循环结束
    {
        PrintNumber(number);
    }
    delete[]number;
    number = NULL;

}

字符串模拟加法:

bool Increment(char *number)
{
    bool isOverflow = 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)
            {
                isOverflow = true;
            }
            else
            {
                nSum -= 10;
                nTakeOver = 1;
                number[i] = '0' + nSum;
            }
        }
        else
        {
            number[i] = '0' + nSum;
            break;
        }

    }
    return isOverflow;

}

出于真实角度,若字符串前面几个字符为‘0’,我们不需要将他们打印


void PrintNumber(char *number)
{
    bool isBeginning0 = true;

    int nLength = strlen(number);

    for (int i = 0; i < nLength - 1; ++i)
    {
        if (isBeginning0&&number[i] != 0)
        {
            isBeginning0 = false;
        }
        if (!isBeginning0)
        {
            printf("%c", number[i]);
        }
    }
    printf("\t");
}

测试:

int main()
{
    Print1ToMaxOfDigits(2);
    return 0;
}

这里写图片描述


//换种思路把思路转成数字排列的解法,递归让代码更简单
//全排列用递归很容易表达,数字的每一位都可能是0~9中的每一个数
//n位所有十进制数其实就是n个从0到9的全排列,也就是说把每一位的0~9排列一遍,就得到了所有的十进制数,只是我们在打印的时候,数字排在前面的0我们不打印出来罢了
void Print1ToMaxOfNDigitsRecursively(char* number, int  length, int index);
void Print1ToMaxOfNDigits(int n)
{
    if (n <= 0)
    {
        return;
    }

    char *number = new char[n + 1];
    number[n] = '\0';

    for (int i = 0; i < 10; ++i)
    {
        number[0] = i + '0';
        Print1ToMaxOfNDigitsRecursively(number, n, 0);

    }

    delete[] number;
}

void Print1ToMaxOfNDigitsRecursively(char* number, int  length, int index)
{
    if (index == length - 1)
    {
        PrintNumber(number);
        return;
    }

    for (int i = 0; i < 10; ++i)
    {
        number[index + 1] = i + '0';
        Print1ToMaxOfNDigitsRecursively(number, length, index + 1);

    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值