9 打印1到最大n位数:输入数字n,按顺序打印出从1到n位最大十进数的数值

一、题目
输入数字n,按顺序打印出从1到n位最大十进数的数值。比如输入3,则打印出1、2、3一直到最大三位数即999。
二、解题思路
①使用一个n位的数组来存储每一位的元素。例如n位3,则000表示为[0,0,0]。
使用递归的方式,存放每一位元素值。
②同上,使用一个n位的数组来存储每一位的元素。然后循环执行加1运算,并在数组中进行模拟进位,直到最高位需要进位,则表示循环结束

方法一

   public void print1ToMaxOfNDights1s(int n) {
        if (n < 0) {
            return;
        }
        char[] digits = new char[n];

        for (int i = 0; i < n; i++) {
            digits[i] = '0';//初始化

        }
        for (int i = n - 1; i >= 0; i--) {
            System.out.println("我是for循环");
            while (digits[i] != '9') {//n=1,0;
                System.out.println("我是第二层的while循环");
                int m = 0;//   digit[0]为计算位,累加
                digits[m]++;//digins[0]++   只能加到9  ,char中10代表换行键

                while (m < n - 1 && digits[m] > '9') {

                    digits[m] = '0';
                    digits[m + 1]++;
                    m++;
                }
                printdigits(digits);
            }

        }
    }
//打印
  private void printdigits(char[] digits) {

        int m = digits.length - 1;
        while (digits[m] == '0') {
            m--;

        }
        for (int i = m; i >= 0; i--) {
            System.out.print(digits[i]);

        }
        System.out.println();
    }

方法二


public void printOneToNthDigits(int n,char[]  char){
	if(n>=char.length){
		printArr(char);
	}else{
		for(int i=0;i<=9;i++){
			arr[n]=i;
			printOneToNthDigits(n+1,char);
		}
	}
	
}
 /*   分析递归   的每一层
                    for(int i=0;i<=9;i++){
                            arr[0]==0;                //sys arr[0=0;  n==   arr[0]=1:0,1,2,3,4,5,6,7,8,9,
                            printdigit(1,arr) 1<2;  //end2
                                for(int i=0; i<=9;i++){
                                    arr[1]=0;   1,2,,3,4,5,6,7,8,9   [][9]
                                     printdigits(2,arr)//end1
                                        printarr();//end1

                                }
                    }



                 */

方法三

/**
     * 输入数字n,按顺序打印出从1最大的n位十进制数。
     *
     * @param n   当前处理的是第个元素,从0开始计数
     * @param arr 存放结果的数组
     */


/**
     * 输入数字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;  
    } 

  /**
     * 输入数组的元素,从左到右,。从第一个非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();
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值