题目:
输入数字n,按顺序打印出从1到最大的n位十进制数。
比如输入3,则打印出1,2,3,... ,一直到最大的3位数即 999.
题目的陷阱:
当输入的n很大时,此时就是一个大数问题。
解决方案:
在数组或者字符串上模拟数字加法的解法,绕过陷阱
Java代码:

1 package com.hb; 2 3 import java.util.ArrayList; 4 import java.util.Iterator; 5 6 public class Print1ToMaxOfNDigits { 7 public void Print1ToMaxofNDigits(int n){ 8 //用nlist表示数n,nlist[0]表示n的最高位 ------注意,看别人程序时,有可能有的地方不是对的,还是要有自己的思想 9 ArrayList<Integer> nlist = new ArrayList<Integer>(); 10 for(int i = 0 ; i < n ; i++){ 11 nlist.add(0); //将元素添加到列表的尾部 12 } 13 14 increment(nlist); 15 } 16 17 //用数组模拟数字+1 18 public static void increment(ArrayList<Integer> nlist){ 19 int carrybit = 0 ; //carrybit是进位的意思 20 boolean end = false ; 21 while(true){ 22 23 for(int i = nlist.size() - 1 ; i >= 0 ; i--){ 24 int digit = nlist.get(i); 25 int sum = digit + carrybit ; //从个位开始,加1 26 if(i == (nlist.size() - 1)){ 27 sum += 1 ; //sum++ 28 } 29 if(sum >= 10){ 30 //最高位产生进位,达到最大值,停止输出 31 if(i == 0 ){ 32 end = true; 33 } 34 sum = sum - 10; 35 carrybit = 1 ; 36 }else{ 37 carrybit = 0 ; 38 } 39 40 nlist.set(i, sum); 41 } //for循环结束 42 43 output(nlist); 44 if(end) {break; } 45 } 46 } 47 48 //输出数字,将高位的 0 舍掉 49 public static void output(ArrayList<Integer> nlist){ 50 Iterator<Integer> ite = nlist.iterator(); 51 int num; 52 //找到第一个为 0 的位置 53 boolean first = false ; 54 55 while (ite.hasNext()){ 56 if(first){ 57 System.out.print("--" + ite.next()); 58 continue; 59 } 60 if((num = ite.next()) != 0){ 61 first = true ; 62 System.out.print("+++"+num); 63 } 64 } 65 System.out.println(); 66 } 67 68 public static void main(String[] args) { 69 Print1ToMaxOfNDigits p = new Print1ToMaxOfNDigits(); 70 int n = 2; 71 p.Print1ToMaxofNDigits(n); 72 } 73 74 75 76 }
转载:http://www.2cto.com/kf/201311/256909.html