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

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

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

算法源程序:

   
   
  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. }

程序运行结果:

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值