剑指offer: 打印从1到最大的n位数

剑指offer: 打印从1到最大的n位数

题目:

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

思路:

1.利用字符串模拟数字的加法。

2.采用全排列的思路,并使用递归实现全排列。

实现:

思路1:

class Solution{
public:
    void Print1ToMax(const int n){
        char* digit = new char[n+1];           //使用字符串数组模拟一个大的整数,注意要加上'\0'
        memset(digit, '0', n);                 //将每一位都初始化为0;
        digit[n] = '\0';
        while(!Increment(digit, n))            //Increment负责给当前digit+1,返回值是是否到达最大值
        {
            PrintDigit(digit, n);              //PrintDigit负责打印当前数字
        }
    }
private:
    bool Increment(char* digit, int n)
    {
        bool flag = false;                     //flag标记了是否达到了第0位
        int carry = 0;                         //carry表示是否进位
        int temp;                              //temp是一个临时的int型变量
        int start = n - 1;                     //从最后一位开始
        temp = digit[start] - '0' + 1;
        digit[start] = temp % 10 + '0';
        if (temp == 10)
        {
            carry = 1;                         //产生了进位
            while(carry == 1)
            {
                start--;
                if (start < 0) return true;    //第0位产生了进位
                temp = digit[start] - '0' + 1;
                digit[start] = temp % 10 + '0';
                carry = (temp == 10) ? 1 : 0;
            }
        }
        return false;
    }
    void PrintDigit(char* digit, int n)
    {
        /*从左边第一个不为0的数字开始打印 */
        int start = 0;
        while(digit[start] == '0') start++;
        for (int i = start; i < n; i++) printf("%c", digit[i]);
        printf("\n");
    }
};

思路2:

class Solution{
public:
    void Printoneton(int n)
    {
        char* number = new char[n+1];
        number[n] = '\0';
        for(int i = 0; i <= 9; i++)
        {
            number[0] = '0' + i;
            dfs(number, n ,0);         //从第0位开始搜索
        }
        delete []number;
    }
private:
    void dfs(char* number, int n, int index)
    {
        if (index  == n - 1)                           //递归出口,当index == n-1
        {
            PrintDigit(number, n);
            return;
        }
        for (int i = 0; i <= 9; i++)
        {
            number[index+1] = '0' + i;
            dfs(number, n, index + 1);
        }
    }
    void PrintDigit(char* digit, int n)
    {
        /*从左边第一个不为0的数字开始打印 */
        int start = 0;
        while(digit[start] == '0') start++;
        for (int i = start; i < n; i++) printf("%c", digit[i]);
        printf("\n");
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值