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

题目描述

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

首先最容易想到的方法是

1     public static void show(int n){
2         int max = (int) (Math.pow(10, n)-1);
3         for (int i = 0; i <= max; i++) {
4             System.out.println(i);
5         }
6     }

但这样遇到n是特别大的时候会溢出

于是也可以用大数类改造一下

1 public static void show(int n){    
2         BigDecimal m =new BigDecimal(1);
3         BigDecimal dig =new BigDecimal(10);
4         BigDecimal pow = dig.pow(n).subtract(m);
5         for (BigDecimal i = m; i.compareTo(pow)<1; i=i.add(m)) {
6             System.out.println(i);
7         }
8     }

另外,可以用 char 数组进行存储。 使用回溯法得到所有的数。

 1         public void show(int n){
 2         if(n < 0) return;
 3         char [] number = new char [n];
 4         show(number,0);
 5         }
 6 
 7         public void show(char[] number , int digit){
 8         if(digit == number.length)  {printshow(number); return;}
 9         for(int i=0; i<10; i++){
10         number[digit]=(char)(i+'0');
11         show(number,digit+1);
12         }
13         }
14         public void printshow(char[] number){
15             BigDecimal big =new BigDecimal(String.valueOf(number));
16             System.out.println(big);
17         }

一个位数一个位数的打印,10次循环每一次递归打印下一位

 

posted @ 2019-08-22 10:32  chyblogs  阅读(149)  评论(0)    收藏  举报