剑指Offer面试题12:打印1到最大的n位数 Java实现

题目:打印1到最大的n位数
          输入数字n,按顺序打印出从1到最大n位十进制数。比如输入n = 3,则打印出1,2,3……999.
算法分析:

如果我们在数字前面补0的话,就会发现n位所有十进制数其实就是n个从0到9的全排列。也就是说,我们把数字的每一位都从0到9排列一遍,就得到了所有的十进制数。只是打印的时候,数字排在前面的0我们不打印出来罢了。

算法源程序:
以下程序参考自博客: http://blog.csdn.net/derrantcm/article/details/45529157

 
    
  1. /**************************************************************
  2. * Copyright (c) 2016, 北京邮电大学
  3. * All rights reserved.
  4. * 版 本 号:v1.0
  5. * 题目描述:打印1到最大的n位数
  6. * 输入数字n,按顺序打印出从1到最大n位十进制数。比如输入n = 3,则打印出1,2,3……999.
  7. * 输入描述:3
  8. * 程序输出: 1,2,3……999
  9. * 问题分析:无
  10. * 算法描述:如果我们在数字前面补0的话,就会发现n位所有十进制数其实就是n个从0到9的全排列。也就是说,
  11. * 我们把数字的每一位都从0到9排列一遍,就得到了所有的十进制数。只是打印的时候,数字排在前面的0我们不打印出来罢了。
  12. *
  13. * 完成时间:2016-10-30
  14. ***************************************************************/
  15. package org.marsguo.offerproject12;
  16. import java.util.Scanner;
  17. class SolutionMethod1{
  18. public void printOneToNthDigits(int n){
  19. if(n < 1){
  20. throw new RuntimeException("The input must larger than 0");
  21. }
  22. int[] arr = new int[n];
  23. printOneToNthDigits(0,arr);
  24. }
  25. public void printOneToNthDigits(int n,int[] arr){
  26. if(n >= arr.length){
  27. printArray(arr);
  28. }else{
  29. for(int i = 0; i <= 9; i++){
  30. arr[n] = i;
  31. printOneToNthDigits(n + 1,arr);
  32. }
  33. }
  34. }
  35. public void printArray(int[] arr){
  36. int index = 0;
  37. while(index < arr.length && arr[index] == 0){
  38. index++;
  39. }
  40. for(int i = index; i < arr.length; i++){
  41. System.out.print(arr[i]);
  42. }
  43. if(index < arr.length){
  44. System.out.println();
  45. }
  46. }
  47. public void printOneToNthDigits2(int n){
  48. if(n < 1){
  49. throw new RuntimeException("The input number must larger than 0");
  50. }
  51. int[] arr = new int[n];
  52. for(int i = 0; i < arr.length; i++){
  53. arr[i] = 0;
  54. }
  55. while(addOne(arr) == 0){
  56. printArray(arr);
  57. }
  58. }
  59. public int addOne(int[] arr){
  60. int carry = 1;
  61. int index = arr.length;
  62. do{
  63. index--;
  64. arr[index]+=carry;
  65. carry = arr[index]/10;
  66. arr[index]%= 10;
  67. }while(carry != 0 && index > 0);
  68. if(carry > 0 && index == 0){
  69. return 1;
  70. }
  71. return 0;
  72. }
  73. }
  74. public class PrintOneToMaxDigits {
  75. public static void main(String[] args){
  76. Scanner scanner = new Scanner(System.in);
  77. System.out.println("请输入位数n:");
  78. int n = scanner.nextInt();
  79. scanner.close();
  80. SolutionMethod1 solution1 = new SolutionMethod1();
  81. System.out.println("输出数字为:");
  82. solution1.printOneToNthDigits(n);
  83. solution1.printOneToNthDigits2(n);
  84. }
  85. }

程序运行结果:

  剑指Offer面试题12:打印1到最大的n位数 Java实现_第1张图片

你可能感兴趣的:(剑指offer,算法,面试题,剑指Offer)