编程进阶网编程进阶网
  • 基础组成体系
  • 程序编程原理
  • 异常和IO系统
  • 六大设计原则
  • 设计模式导读
  • 创建型设计模式
  • 结构型设计模式
  • 行为型设计模式
  • 设计模式案例
  • 面向对象思想
  • 基础入门
  • 高级进阶
  • JVM虚拟机
  • 数据集合
  • Java面试题
  • C语言入门
  • C综合案例
  • C标准库
  • C语言专栏
  • C++入门
  • C++综合案例
  • C++专栏
  • HTML
  • CSS
  • JavaScript
  • 前端专栏
  • Swift
  • iOS入门
  • 基础入门
  • 开源库解读
  • 性能优化
  • Framework
  • 方案设计
  • 媒体音视频
  • 硬件开发
  • Groovy
  • 常用工具
  • 大厂面试题
  • 综合案例
  • 网络底层
  • Https
  • 网络请求
  • 故障排查
  • 专栏
  • 数组
  • 链表
  • 栈
  • 队列
  • 树
  • 递归
  • 哈希
  • 排序
  • 查找
  • 字符串
  • 其他
  • Bash脚本
  • Linux入门
  • 嵌入式开发
  • 代码规范
  • Markdown
  • 开发理论
  • 开发工具
  • Git管理
  • 百宝箱
  • 开源协议
  • 技术招聘
  • 测试经验
  • 职场提升
  • 技术模版
  • 关于我
  • 目标清单
  • 学习框架
  • 育儿经验
  • 我的专栏
  • 底层能力
  • 读书心得
  • 随笔笔记
  • 职场思考
  • 中华历史
  • 经济学故事
  • 基础组成体系
  • 程序编程原理
  • 异常和IO系统
  • 六大设计原则
  • 设计模式导读
  • 创建型设计模式
  • 结构型设计模式
  • 行为型设计模式
  • 设计模式案例
  • 面向对象思想
  • 基础入门
  • 高级进阶
  • JVM虚拟机
  • 数据集合
  • Java面试题
  • C语言入门
  • C综合案例
  • C标准库
  • C语言专栏
  • C++入门
  • C++综合案例
  • C++专栏
  • HTML
  • CSS
  • JavaScript
  • 前端专栏
  • Swift
  • iOS入门
  • 基础入门
  • 开源库解读
  • 性能优化
  • Framework
  • 方案设计
  • 媒体音视频
  • 硬件开发
  • Groovy
  • 常用工具
  • 大厂面试题
  • 综合案例
  • 网络底层
  • Https
  • 网络请求
  • 故障排查
  • 专栏
  • 数组
  • 链表
  • 栈
  • 队列
  • 树
  • 递归
  • 哈希
  • 排序
  • 查找
  • 字符串
  • 其他
  • Bash脚本
  • Linux入门
  • 嵌入式开发
  • 代码规范
  • Markdown
  • 开发理论
  • 开发工具
  • Git管理
  • 百宝箱
  • 开源协议
  • 技术招聘
  • 测试经验
  • 职场提升
  • 技术模版
  • 关于我
  • 目标清单
  • 学习框架
  • 育儿经验
  • 我的专栏
  • 底层能力
  • 读书心得
  • 随笔笔记
  • 职场思考
  • 中华历史
  • 经济学故事
  • 01.斐波那契数列
  • 02.跳台阶问题
  • 03.二进制中1的个数
  • 04.求从1到n整数中1出现次数
  • 05.打印1到最大的n位数
  • 06.n个骰子的点数
  • 07.扑克牌的顺子
  • 08.不用加减乘除做加法
  • 10.机器人的运动范围

05.打印1到最大的n位数

目录介绍

  • 01.题目要求
  • 02.问题分析
  • 03.实例代码

好消息

  • 博客笔记大汇总【15年10月到至今】,包括Java基础及深入知识点,Android技术博客,Python学习笔记等等,还包括平时开发中遇到的bug汇总,当然也在工作之余收集了大量的面试题,长期更新维护并且修正,持续完善……开源的文件是markdown格式的!同时也开源了生活博客,从12年起,积累共计N篇[近100万字,陆续搬到网上],转载请注明出处,谢谢!所有博客陆续更新到GitHub上!
  • 链接地址:https://github.com/yangchong211/YCBlogs
  • 如果觉得好,可以star一下,谢谢!当然也欢迎提出建议,万事起于忽微,量变引起质变!

01.题目要求

  • 问题如下所示:
    • 输入数字n,按顺序打印出从1到n位最大十进数的数值。比如输入3,则打印出1、2、3一直到最大三位数即999。

02.问题分析

  • ①使用一个n位的数组来存储每一位的元素。例如n位3,则000表示为[0,0,0]。使用递归的方式,存放每一位元素值。
  • ②同上,使用一个n位的数组来存储每一位的元素。然后循环执行加1运算,并在数组中进行模拟进位,直到最高位需要进位,则表示循环结束。

03.实例代码

  • 如下所示
    public class Test {  
      
        /** 
         * 输入数字n,按顺序打印出从1最大的n位十进制数。比如输入3,则打印出1、2、3 一直到最大的3位数即999。 
         * 
         * @param n 数字的最大位数 
         */  
        public static void printOneToNthDigits(int n) {  
            // 输入的数字不能为小于1  
            if (n < 1) {  
                throw new RuntimeException("The input number must larger than 0");  
            }  
            // 创建一个数组用于打存放值  
            int[] arr = new int[n];  
            printOneToNthDigits(0, arr);  
        }  
      
        /** 
         * 输入数字n,按顺序打印出从1最大的n位十进制数。 
         * 
         * @param n   当前处理的是第个元素,从0开始计数 
         * @param arr 存放结果的数组 
         */  
        public static void printOneToNthDigits(int n, int[] arr) {  
      
            // 说明数组已经装满元素  
            if (n >= arr.length) {  
                // 可以输出数组的值  
                printArray(arr);  
            } else {   
                for (int i = 0; i <= 9; i++) {  
                    arr[n] = i;  
                    printOneToNthDigits(n + 1, arr);  
                }  
            }  
        }  
      
        /** 
         * 输入数组的元素,从左到右,从第一个非0值到开始输出到最后的元素。 
         * 
         * @param arr 要输出的数组 
         */  
        public static void printArray(int[] arr) {  
            // 找第一个非0的元素  
            int index = 0;  
            while (index < arr.length && arr[index] == 0) {  
                index++;  
            }  
      
            // 从第一个非0值到开始输出到最后的元素。  
            for (int i = index; i < arr.length; i++) {  
                System.out.print(arr[i]);  
            }  
            // 条件成立说明数组中有非零元素,所以需要换行  
            if (index < arr.length) {  
                System.out.println();  
            }  
        }  
      
        /** 
         * 输入数字n,按顺序打印出从1最大的n位十进制数。比如输入3,则打印出1、2、3 一直到最大的3位数即999。 
         * 【第二种方法,比上一种少用内存空间】 
         * 
         * @param n 数字的最大位数 
         */  
        public static void printOneToNthDigits2(int n) {  
            // 输入值必须大于0  
            if (n < 1) {  
                throw new RuntimeException("The input number must larger than 0");  
            }  
      
            // 创建一个长度为n的数组  
            int[] arr = new int[n];  
            // 为数组元素赋初始值  
            for (int i = 0; i < arr.length; i++) {  
                arr[i] = 0;  
            }  
      
            // 求结果,如果最高位没有进位就一直进行处理  
            while (addOne(arr) == 0) {  
                printArray(arr);  
            }  
        }  
      
        /** 
         * 对arr表示的数组的最低位加1 arr中的每个数都不能超过9不能小于0,每个位置模拟一个数位 
         * 
         * @param arr 待加数组 
         * @return 判断最高位是否有进位,如果有进位就返回1,否则返回0 
         */  
        public static int addOne(int[] arr) {  
            // 保存进位值,因为每次最低位加1  
            int carry = 1;  
            // 最低位的位置的后一位  
            int index = arr.length;  
      
            do {  
                // 指向上一个处理位置  
                index--;  
                // 处理位置的值加上进位的值  
                arr[index] += carry;  
                // 求处理位置的进位  
                carry = arr[index] / 10;  
                // 求处理位置的值  
                arr[index] %= 10;  
            } while (carry != 0 && index > 0);  
      
            // 如果index=0说明已经处理了最高位,carry>0说明最高位有进位,返回1  
            if (carry > 0 && index == 0) {  
                return 1;  
            }  
      
            // 无进位返回0  
            return 0;  
        }   
    }

其他内容

01.关于博客汇总链接

  • 1.技术博客汇总
  • 2.开源项目汇总
  • 3.生活博客汇总
  • 4.喜马拉雅音频汇总
  • 5.其他汇总

02.关于我的博客

  • 我的个人站点:
  • github:https://github.com/yangchong211
  • 知乎:https://www.zhihu.com/people/yczbj/activities
  • 简书:http://www.jianshu.com/u/b7b2c6ed9284
  • csdn:http://my.csdn.net/m0_37700275
  • 喜马拉雅听书:http://www.ximalaya.com/zhubo/71989305/
  • 开源中国:https://my.oschina.net/zbj1618/blog
  • 泡在网上的日子:http://www.jcodecraeer.com/member/content_list.php?channelid=1
  • 邮箱:yangchong211@163.com
  • 阿里云博客:https://yq.aliyun.com/users/article?spm=5176.100- 239.headeruserinfo.3.dT4bcV
  • segmentfault头条:https://segmentfault.com/u/xiangjianyu/articles
  • 掘金:https://juejin.im/user/5939433efe88c2006afa0c6e
贡献者: yangchong211
上一篇
04.求从1到n整数中1出现次数
下一篇
06.n个骰子的点数