打印1到最大的n位数

题目:输入数字n,按顺序打印出从1到最大的n位十进制数,比如输入数字3,则打印出1,2,3一直到最大的三位数999。

这道题中,题目并没有说明n的范围,所以我们需要考虑到大数问题。我们通常用字符串或数组表达大数,字符串里的每个字符都是‘0’到‘9’之间的某一个字符,用来表示数字中的一位,因为数字最大是n位的,因此我们需要一个n+1的字符串(字符串中最后一个是结束字符’\0’)。当实际数字不够n位的时候,在字符串的前半部分补0。
首先我们把字符串中的每一个数字都初始化为‘0’,然后每一次为字符表示的数字加1。

那么什么时候停止给字符串表示的数字加1呢?我们注意到,当字符串为“999…9”时,给字符串加1,就会在第一位上产生进位,此时表示已经到了最大的n位数,循环终止。

bool InCreament(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;
}

第二步,打印数字。这里需要注意的是,比如数字为099,我们需要打印的是99,忽略前面的0。所以,在打印的时候,我们需要从第一个不为0的位开始打印。

void PrintNumber(char* number)
{
    bool isBegining0 = true;
    int nlength = strlen(number);
    for (int i = 0; i < nlength; ++i)
    {
        if (isBegining0 && number[i] != '0')
        {
            isBegining0 = false;
        }
        if (!isBegining0)
        {
            //打印第一个非0位的数字
            printf("%c", number[i]);
        }
    }
    printf("\t");
}
void Print1ToMaxOfDigits(int n)
{
    if (n <= 0)
        return;
    char* number = new char[n + 1];
    memset(number, '0', n);
    number[n] = '\0';
    while (!InCreament(number))
    {
        PrintNumber(number);
    }
    delete[] number;
 }

当n为2的时候,应该打印出1到99的每个数字。

int main()
{
    Print1ToMaxOfDigits(2);
    system("pause");
    return 0;
}

这里写图片描述

我们可以想到,其实n未的所有十进制就是在每个位上对0-9进行一次全排列,数字的每一位都有可能是0-9中的一个数。

void PrintNumber(char* number)
{
    bool isBegining0 = true;
    int nlength = strlen(number);
    for (int i = 0; i < nlength; ++i)
    {
        if (isBegining0 && number[i] != '0')
        {
            isBegining0 = false;
        }
        if (!isBegining0)
        {
            //打印第一个非0位的数字
            printf("%c", number[i]);
        }
    }
    printf("\t");
}

void PrintDigtit(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';
        PrintDigtit(number, length, index + 1);
    }
}


void PrintMax(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';
        PrintDigtit(number, n, 0);
    }
    delete[] number;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值