[剑指Offer]打印1到最大的n位数

本文详细介绍了两种方法来打印从1到最大n位十进制数的过程:模拟加法实现和递归实现。在处理大数问题时,直接使用int或long类型会遇到限制,因此需要采取特殊的处理方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

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

陷阱:n非常大的时候,int、long均不好使。

解题思路

思路一:
     我们可以模拟加法来打印。需要注意的是进位问题和是否已经到达最大的n位十进制数。

思路二:
     采用递归的解法。数字的每一位都可能是0-9中的一个数,然后设置下一位,递归结束的条件是我们设置数字的最后一位。


代码


模拟加法实现

/**
	 * 模拟加法来顺序打印1到最大的n位数
	 * @param n
	 */
	public static void print1ToMaxOfNDigitsByAnalogAddition(int n) {
		if (n <= 0)
			return;

		byte[] num = new byte[n];
		boolean flag = true;//标记是否已经是最大的n位数
		int takeOver = 0;// 进位符

		Arrays.fill(num, (byte) 0);

		while (flag) {
			takeOver = 0;// 进位符归0
			for (int i = n - 1; i >= 0; i--) {
				int temp = (num[i] - (byte) 0) + takeOver;// 计算当前位的值

				if (i == n - 1) {
					temp++;// 如果是最末位则自增
				}

				if (temp >= 10) {
					// 当前位大于10
					if (i == 0) {
						// 如果第0位已经大于10,则将变为n+1位
						flag = false;
					} else {
						temp -= 10;
						takeOver = 1;
						num[i] = (byte) temp;
					}
				} else {
					// 如果没有进位,则结束
					num[i] = (byte) temp;
					break;
				}
			}

			if (flag) {
				//打印数组
				int i = 0;
				while (i < n && num[i] == (byte) 0) {
					i++;
				}
				while (i < n) {
					System.out.print(num[i] - (byte) 0);
					i++;
				}
				System.out.println("");
			}
		}
	}

递归实现

/**
	 * 递归来顺序打印1到最大的n位数
	 * @param n
	 */
	public static void print1ToMaxOfNDigitsByRecursive(int n) {
		if (n <= 0)
			return;

		byte[] num = new byte[n];

		for (int i = 0; i < 10; i++) {
			num[0] = (byte) i;
			print1ToMaxOfNDigitsRecursively(num, 0);
		}

	}

	public static void print1ToMaxOfNDigitsRecursively(byte[] num, int index) {
		if (index == num.length - 1) {
			//打印数组
			int i = 0;
			while (i < num.length && num[i] == (byte) 0) {
				i++;
			}
			while (i < num.length) {
				System.out.print(num[i] - (byte) 0);
				i++;
			}
			System.out.println("");
			return;
		}

		for (int i = 0; i < 10; i++) {
			num[index + 1] = (byte) i;
			print1ToMaxOfNDigitsRecursively(num, index + 1);
		}
	}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值