剑指Offer12打印1到最大的n位数

题目:

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

注意陷阱:n位数,可能是int型盛不下的数,所以需要用大数来模拟。

有两种方法,一种就是大数模拟,每次加1,然后输出。

还有一中就是利用全排列,把其想成n位数的全排列,每一位数是从0到9的全排列。


方法1

void Print1ToLastDigist(int n)
{
    if (n<0)
        return ;
    char *num = new char[n];
    memset(num,'0',n);
    num[n] = '\0';
    while(!Increment(num))
        PrintNum(num);
}



Increament(num)这个函数就是控制每次加1的,但是有一个问题,就是咱们需要判断是否到达了最大n位数,最先想到的就是逐个位置进行比较,但是这样的时间复杂度就太高了,所以在Increament()函数中进行了处理,就是只有当最高位得到进位的时候才返回一个true,这样就不需要打印了

bool Increment(char *num)
{
    bool IsOverFlover = false;
    int TakeOver = 0;
    int nlength = strlen(num);
    for(int i= nlength-1;i>= 0;i--)
    {
        int sum = num[i]-'0'+TakeOver;
        if(i == nlength-1)
            sum++;
        if(sum >= 10)
        {
            TakeOver = 1;
            if(i==0)
                IsOverFlover = true;
            else
            {
                sum = sum - 10;
                num[i] = sum + '0';
            }
        }
        else
        {
            num[i] = '0'+sum;
            break;
        }
    }
    return IsOverFlover;
}
然后是输出函数,这里需要说明的是如果高位是0的话,就不用输出了,只从第一个不是0的数开始往外输出

方法2代码:


void PrintNum(char *num)
{
    int nlength = strlen(num);
    int i;
    for(i=0;i<=nlength-1;i++)
    {
        if(num[i] != '0')
            break;
    }
    for(;i<=nlength-1;i++)
        cout<<num[i];
    cout<<"\t";
}

void Print1ToMaxOfN(char *num,int length,int index)
{
    if(index == length-1)
    {
        PrintNum(num);
        return ;
    }
    for(int i=0;i<10;i++)
    {
        num[index + 1] = i + '0';
        Print1ToMaxOfN(num,length,index+1);
    }
}
void Print1ToLastDigistFangFa2(int n)
{
    if(n<0)
        return ;
    char *num = new char[n];
    num[n] = '\0';

    for(int i=0;i<10;i++)
    {
        num[0] = i + '0';
        Print1ToMaxOfN(num,n,0);
    }
    delete []num;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值