• (剑指Offer)面试题12:打印1到最大的n位数


    题目:

    输入数字n,按顺序打印出从1到最大的n位十进制数。

    比如输入3,打印1,2,3一直到最大的3位数即999。

    思路:

    1、不考虑n的范围,直接打印。

    void Print1ToMaxOfNDigits_1(int n){
        int number=1;
        for(int i=0;i<n)
            number=10*number;
        for(int i=1;i<number;i++)
            cout<<i<<"	";
        cout<<endl;
    }
    

    2、如果n很大,能表示范围超出了int 或者long long的范围,那么就需要考虑大数问题。

    最常用也是最容易的方法就是用字符串或者数组来表示大数。

    数字最大为n位,因此我们需要一个n+1长度的字符串来存储,最后一位为结束符号'',实际位数不够n位时,在字符串前部分补‘0’.(打印的时候将前面的'0'去掉)

    步骤:

    1、字符串每一位都初始化为‘0’;

    2、每一次为字符串表示的数字+1,如果没有超出范围,则打印出来;

    如何判断有没有溢出?+

    当字符串表示的第一位数即最高位,(最高位+进位)大于或等于10,即判断溢出。

    如何打印字符串?

    打印字符串时,需要将前部分的'0'省略掉。

    递归实现:

    n位所有十进制数其实就是n个从0到9的全排列。即把数字的每一位都从0到9排列一遍,就得到了所有的十进制数。

    全排列用递归很容易实现,数字的每一位都可能是0-9的一个,然后设置下一位。递归的结束条件是我们已经设置了数字的最后一位。

    代码:

    #include <iostream>
    #include <string.h>
    
    using namespace std;
    
    bool Increment(char* number){
        bool isOverflow=false;
        int nTakeOver=0;
        int nLength=strlen(number);
        int nSum;
    
        for(int i=nLength-1;i>=0;i--){
            nSum=number[i]-'0'+nTakeOver;
            if(i==nLength-1)
                nSum++;
            if(nSum>=10){
                if(i==0)
                    isOverflow=true;
                else{
                    nSum=nSum-10;
                    nTakeOver=1;
                    number[i]='0'+nSum;
                }
            }
            else{
                number[i]='0'+nSum;
                break;
            }
        }
        return isOverflow;
    }
    
    void PrintNumber(char* number){
        int i=0;
        int length=strlen(number);
        while(number[i]=='0')
            i++;
        for(int j=i;j<length;j++)
            cout<<number[j];
        cout<<"	";
    }
    
    void Print1ToMaxOfNDigits(int n){
        if(n<=0)
            return;
        char* number=new char[n+1];
        memset(number,'0',n);
        number[n]='';
    
        while(!Increment(number))
            PrintNumber(number);
    
        delete number;
    }
    
    void Print1ToMaxOfNDigits_1(int n){
        int number=1;
        for(int i=0;i<n)
            number=10*number;
        for(int i=1;i<number;i++)
            cout<<i<<"	";
        cout<<endl;
    }
    
    int main()
    {
        Print1ToMaxOfNDigits(3);
        return 0;
    }
    
    #include <iostream>
    #include <string.h>
    
    using namespace std;
    
    void PrintNumber(char* number){
        int i=0;
        int length=strlen(number);
        while(number[i]=='0')
            i++;
        for(int j=i;j<length;j++)
            cout<<number[j];
        cout<<"	";
    }
    
    void Print1ToMaxOfNDigits_recursively(char* number,int length,int index){
        if(index==length){
            PrintNumber(number);
            return;
        }
        for(int i=0;i<10;i++){
            number[index]='0'+i;
            Print1ToMaxOfNDigits_recursively(number,length,index+1);
        }
    }
    
    void Print1ToMaxOfNDigits_2(int n){
        if(n<=0)
            return;
        char* number=new char[n+1];
        number[n]='';
        Print1ToMaxOfNDigits_recursively(number,n,0);
        delete number;
    }
    
    int main()
    {
        Print1ToMaxOfNDigits_2(3);
        return 0;
    }
    

      

  • 相关阅读:
    来自平时工作中的javascript知识的积累---持续补充中
    javascript function
    CSS3 3D变换
    HTTP1.1缓存策略
    jQuery插件开发
    mac下好用的工具收录(慢慢完善)
    mac 彻底卸载vscode
    Git冲突:commit your changes or stash them before you can merge. 解决办法(转载)
    关于vscode使用的一些设置
    (linux服务器)apache开启gzip的配置以及效果对比
  • 原文地址:https://www.cnblogs.com/AndyJee/p/4633798.html
Copyright © 2020-2023  润新知