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

考察点

大数问题
知识点

题目

分析
这道题目唯一需要考虑的点就是n很大的时候会存在数字溢出的情况,因此这种肯定属于大数问题,大数问题就是用字符串表示数字。题目要求从1打印到最大的n位十进制数,其中必不可少的运算就是加法和打印,只要想一想我们普通加法是如何实现的,这个算法不难实现

public class Twelve {
	public static void main(String[] args) {
		printMaxNum(3);
	}
	public static void printMaxNum(int num) {
		if (num <= 0) {
			return;
		}
		String[] numStr = new String[num];
		for (int i = 0;i < num;i++) {
			numStr[i] = "0";
		}
		while(!add(numStr)) {
			printNum(numStr);
		}
	}

	public static boolean add(String[] numStr) {
		int len = numStr.length;
		int carry = 0;
		boolean maxFlag = false;
		for (int i = len - 1;i >= 0;i--) {
			int val = Integer.parseInt(numStr[i]) + carry;
			//末尾每次都加1
			if (i == len - 1) {
				val++;
			}
			//这里是10的时候说明需要进1位,因此不跳出循环继续处理前一位
			if (val == 10) {
				//i=0的时候说明已经加到(n+1)位了,因此需要结束加法循环
				if (i == 0) {
					maxFlag = true;
				}
				val -= 10;
				numStr[i] = String.valueOf(val);
				carry = 1;
			} else {
				//没有进位的情况,每次加完1打印一次,直接跳出循环
				numStr[i] = String.valueOf(val);
				break;
			}
		}
		return maxFlag;
	}
	public static void printNum(String[] numStr) {
		boolean beginFlag = false;
		int len = numStr.length;
		for (int i = 0;i < len; i++) {
			if (!beginFlag && !numStr[i].equals("0")) {
				beginFlag = true;
			}
			if (beginFlag) {
				System.out.print(numStr[i]);
			}
		}
		System.out.println();
	}
}

你可能感兴趣的:(剑指offer,java版,java,算法,开发语言,面试)