《剑指offer》面试题12:打印1到最大的n位数

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

易错点:由于没有规定n的范围,所以当输入的n很大的时候,直接使用int或者long会导致溢出。因此,涉及大数问题,必须使用String。

思路:在字符串上模拟数字加法。以n=3为例,模拟加法时存在的几种情况:

将字符串设置成char[n+1],便于打印和自增。(+1的原因会在后面有注明)

  1. 000-009,即正常加法,个位+1。char[]最后一位自增。
  2. 009-010,进位。解决方法用3。
  3. 099-100,连续进位。设置flag判断当前位置是否需要进位,while(flag)循环每一位。
  4. 998-999,结束打印。判断char[]第一位是否为1,如果为1,则结束。

辅助函数:打印char[]。注:前面是0的不需要打印。

功能函数:while(num[0] == '0') { 内部循环加1 }

注意:char[n+1],当char[]第一位为1是,则在辅助函数中打印为空,并在功能函数中结束循环。便于最大值的判断。

public void Print1ToMaxN(int n) {
	char[] num = new char[n+1];	// 多一位,以便判定最大值
	for (int j=0; j<num.length; j++)
		num[j] = '0';
	while (num[0] == '0') {	
		int i = n;
		int flag = 1;
		while (flag==1 && i>=0) {	// 模拟个位+1
			num[i] += flag;
			if (num[i] > '9') {		// 进位
				num[i] = '0';
				flag = 1;
			} else 					// 未进位,正常加1
				flag = 0;
			i --;
		}
		System.out.println(PrintNum(num));
	}
}
public String PrintNum(char[] num) {		// 不打印数组前面的0
	if (num[0] != '0')	// 最大值+1,输出空
		return "";
	String str = String.valueOf(num);
	int i = 0;
	while (num[i] == '0')
		i++;
	return str.substring(i);
}

猜你喜欢

转载自blog.csdn.net/qq_25024883/article/details/81171781