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

2020-05-12  本文已影响0人  潘雪雯

题目

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

解题思路

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

  1. 字符串表达式中每个数字都初始化为‘0’
  2. 在字符串表达的数字上模拟加法
  3. 字符串表达式的数字打印出来

代码

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

上一篇下一篇

猜你喜欢

热点阅读