美文网首页
面试题17:打印从1到最大的n位数

面试题17:打印从1到最大的n位数

作者: 潘雪雯 | 来源:发表于2020-05-12 07:57 被阅读0次

题目

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

解题思路

这是一道看起来很简单但一点都不简单的题目。
应注意到题目对n的范围没有做限制,当输入n很大时,求最大的n位数是不是用整型或长整型会溢出?也就是需要考虑大数问题

  • 字符串解决大数问题
    让字符串中每个字符都是‘0’~‘9’之间的某一个字符,用来表示数字中的一位。因为数字最大是n位,因此需要一个长度为n+1的字符串(字符串最后一位是结束符‘\0’)。当实际数字不够n位时,在字符串的前半部分补0。
  1. 字符串表达式中每个数字都初始化为‘0’
  2. 在字符串表达的数字上模拟加法
  3. 字符串表达式的数字打印出来
  • 将问题转换成数字排序的解法,用递归
    若在数字前面补0,会发现n位所有十进制就是n个从0到9的全排列。也就是说把数字的每一位都从0到9排列一遍,就得到所有的十进制数,只是在打印的时候,排在前面的0不打印出来。

代码

  • 字符串方式
    细节:字符串按位进行运算,若sum从1递增到9时,考虑进位。若是两位数,则此时a[0]=1,a[1]=0,即每当sum=9时,for循环进行两次。
    image.png
class Solution{
  public:
        bool Icreament_Digits(char *number,int length)
        {
            bool isOverflow = false;
            int  isTakeOver = 0;
            int  sum        = 0;
            cout << "length:" << length << endl;
            for(int i=length; i >=0;i--)
            {
                sum = number[i]- '0' + isTakeOver;
                if(i == length) //字符串的长度不变
                {
                    sum++;
                }

                cout <<"i: "<<i<< " number[i]: " <<number[i] << " sum: " << sum << endl;
                if(sum >= 10)
                {
                    if(i == 0)
                    {
                        isOverflow = true;
                    }
                    else
                    {
                        number[i] = sum%10 + '0';
                        isTakeOver = 1;
                    }
                }
                else
                {
                    number[i] = sum + '0';
                    break;
                }

                //cout << "number[i]: " <<number[i] << " sum: " << sum << endl;
            }
            return isOverflow;
        }
        void PrintNumber(char *number,int length)
        {
            bool isZero = true;
            for(int i = 0;i<=length;i++)
            {
                if(number[i] != '0')
                {
                    isZero = false;
                }
                if(!isZero)
                {
                    cout << number[i];
                }
            }
            cout << endl;
        }
        
        void print1ToN_1(int n)
        {
            char *number = new char[n+1];
            memset(number,'0',n);
            //cout << *number << endl;
            number[n+1] = '\0';
            while(! Icreament_Digits(number,n-1))
            {
                PrintNumber(number,n-1);
            }
            delete[] number;
        }
};

  • 递归
class Solution{
  public:
        
        void PrintNumber(char *number,int length)
        {
            bool isZero = true;
            for(int i = 0;i<=length;i++)
            {
                if(number[i] != '0')
                {
                    isZero = false;
                }
                if(!isZero)
                {
                    cout << number[i];
                }
            }
            cout << endl;
        }
   

        void print1ToNCore(char *number,int length,int index)
        {
            if(index == length)
            {
                PrintNumber(number,length);
            }
            else
            {
                for(int i = 0;i<10;i++)
                {
                    number[index] = i + '0';
                    print1ToNCore(number,length,index+1);
                }
            }
        }
        void print1ToN_2(int n)
        {
            char *number = new char[n-1];
            memset(number,'0',n);
            number[n]='\0';
            print1ToNCore(number,n,0);
            delete[] number;
        }
};

完整代码见Github

相关文章

网友评论

      本文标题:面试题17:打印从1到最大的n位数

      本文链接:https://www.haomeiwen.com/subject/wtvpnhtx.html