zoukankan      html  css  js  c++  java
  • 剑指offer编程题Java实现——面试题12打印1到最大的n位数

    题目:打印1到最大的n位数

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

    这道题考察的地方是如何表示大数问题。由于n是任意大的数组,如果n太大的话n位数就超过了long型能够表示的范围,在面试题11求数值的整数次方的时候题目中已经明确的提示了不考虑大数问题,在这道题中,用字符串或者数组表示大数是一种很简单有效的方法。用字符串表示大数也适用于大数加法、大数减法和大数的乘法问题。

    下面代码是使用数组方式实现大数的产生和打印,在这道题中要特殊考虑的地方是如果实现整数+1,以及低位+1产生的进位问题的处理,还有要如何判断当前数字是否是最大的n位数。

     1 package Solution;
     2 
     3 /**
     4  * 剑指offer面试题12:打印1到最大n位数
     5  * 题目:输入数字n,按顺序打印从1到最大的n位十进制数。
     6  * 比如:输入3,则打印1,2,3一直到999
     7  * 解法一:使用数组表示大数
     8  * @author GL
     9  *
    10  */
    11 public class No12PrintOneToMaxNthDigits {
    12 
    13     //使用数组实现对数进行+1操作
    14     public static boolean increment(int[] number){
    15         if(number.length<1)
    16             throw new RuntimeException("invalid lenth of array");
    17         //最高位产生进位标志,则数组中的数为最大的n位整数
    18         boolean isOverFlow=false;
    19         //进位位
    20         int carry=0;
    21         //没有产生进位的+1,循环只运行1次,产生一个进位,循环多运行一次
    22         for(int i=number.length-1;i>=0;i--){
    23             int sum=number[i]+carry;
    24             if(i==number.length-1)
    25                 sum++;//最低位+1
    26             if(sum>=10){
    27                 //最高位产生进位
    28                 if(i==0)
    29                     isOverFlow=true;
    30                 //普通位产生进位
    31                 else{
    32                     carry=1;
    33                     number[i]=0;
    34                     sum=0;
    35                 }
    36             }else{
    37                 //普通位+1的结果保存到数组中,+1后程序退出循环
    38                 number[i]=sum;
    39                 break;
    40             }
    41         }
    42         return isOverFlow;
    43     }
    44     //打印数组中表示的数,如果数组中表示的数字位数小于n,则不打印前面的0
    45     public static void print(int[] number){
    46         boolean isBeginning=true;
    47         for(int i=0;i<number.length;i++){
    48             if(isBeginning&&number[i]!=0)
    49                 isBeginning=false;
    50             if(!isBeginning)
    51                 System.out.print(number[i]);
    52         }
    53     }
    54     public static void main(String[] args) {
    55         int[] number=new int[3];
    56         while(!increment(number)){
    57             print(number);
    58             System.out.println();
    59         }
    60     }
    61 }
    数组实现大位数的表示

    在实现+1的方法中,使用一个全局变量来表示是否是最大的n位数,也就是当数组的最低位array[0]产生进位的时候就已经达到了n位最大数。另外在实现+1操作时候,如果低位产生进位要将进位位加到高位上。

    打印数字采用的是每生成一个数字,判断此数字是否是最大的n位数,如果不是则打印,然后数字+1,再判断打印的过程。

  • 相关阅读:
    Spark RDD概念学习系列之不同角度看RDD
    Spark RDD概念学习系列之典型RDD的特征
    Spark RDD概念学习系列之RDD的本质特征
    Spark RDD概念学习系列之RDD接口
    kettle的下载、安装和初步使用(Ubuntu 16.04平台下)(图文详解)
    Neo4j下执行cypher-shell时,Connection refused问题解决?
    Ubuntu14.04下沙盒数据导入到 Neo4j 数据库(图文详解)
    Ubuntu16.04下沙盒数据导入到 Neo4j 数据库(图文详解)
    Neo4j沙盒实验申请过程步骤(图文详解)
    Ubuntu14.04下Mongodb数据库可视化工具安装部署步骤(图文详解)(博主推荐)
  • 原文地址:https://www.cnblogs.com/gl-developer/p/6506152.html
Copyright © 2011-2022 走看看