剑指Offer学习之面试题12 :打印1 到最大的n 位数

package com.www.OfferToSword;

public class Solution12 {

	public static void main(String[] args) {
		print(2);
	}

	public static void print(int n) {
		double max = Math.pow(10, n) - 1;
		System.out.println(max);
		for (double i = 0, j = 1; i <= max; i++, j++) {
			System.out.print(i + "\t");
			if (j % 10 == 0) {
				System.out.print("\n");
			}
		}
	}
}

package com.www.OfferToSword;

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

	public static void main(String[] args) {
		printOneToNthDigits2(2);
		System.out.println();
		printOneToNthDigits(2);
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值