Description

输入数字 n,按顺序打印出从1到最大的 n 位十进制数,比如输入3,则打印出1、2、3 一直到最大的 3 位数 999。

Solutions

很明显,这是有陷阱的题目,看上去最简单的方法是,通过数位计算出 n 位数十进制的最大数,然后从 1 循环输出到最大数,但是很明显当 n 比较大的时候是会超过整型的计数范围的。

想起来比较乱,因为进位弄的很乱,还是从功能角度来拆分这个任务会比较好。首先可将任务分成两个部分,第一个是加1操作,每次对这个数加一。第二个操作是打印操作,加数成功后要进行打印。

def PrintList(nums):
	s = ''
	n = len(nums)
	idx = -1
	for i, num in enumerate(nums):
		if num != 0:
			idx = i
			break
	for i in range(i, n):
		s += str(nums[i])

	print s

def Increment(nums):
	is_overflow = False
	n = len(nums)
	takeover = 0

	for i in range(n-1, -1, -1):
		sum_i = nums[i] + takeover

		if i == n-1:
			sum_i += 1

		if sum_i < 10:
			nums[i] = sum_i
			break
		else:
			if i == 0:
				is_overflow = True
				break
			else:
				sum_i -= 10
				takeover  = 1
				nums[i] = 0
	return is_overflow

def Print1ToMaxOfNDigits(n):
	int_list = [0 for _ in range(n)]
	
	while not Increment(int_list):
		PrintList(int_list)

Print1ToMaxOfNDigits(3)