剑指offer书(17)打印1到最大的N位数

package java_jianzhioffer_algorithm;

import java.util.Scanner;

/**
 * 题目:打印1到最大的N位数
 * @author hexiaoli
 * 思考:
 * 1)字符串模拟数字加法。(用字符串或者数组表示大数)
 * 2)转化为数字排列问题
 */
public class PrintToMaxOfDigits {
	public void printToMaxOfDigits1(int n){
		if(n <= 0) {
			System.out.println("输入不合法,n至少应该大于0");
			return ;
		}
		//声明一个字符串数组,用来存放一个大数,并初始化为0
		char[] number = new char[n];
		for (int i = 0; i < number.length; i++) {
			number[i] = '0';
		}
		while(!increment(number)) {//自加不溢出的话,会一直执行
			printNumber(number);//打印大数
		}
	}
	public boolean increment(char[] number) {
		boolean isOverFlow = false;//判断是否溢出
		int length = number.length;//字符串长度
		int nTakeOver = 0;//判断是否需要进位
		for(int i = length -1;i>=0;i--) {
			int nSum = number[i]-'0'+nTakeOver;//第i位的字符转化为数字+进位符
			if(i == length -1) nSum++;//末尾自加1
			if(nSum >= 10) {
				if(i == 0) {//最高位溢出
					isOverFlow =true;
				}else {//需要进位
					nSum -=10;//末尾清零
					nTakeOver = 1;//需要进位
					number[i] = (char)('0'+nSum);
				}
			}else {//nSum<10
				number[i] = (char)('0'+nSum);
				break;
			}
		}	
		return isOverFlow;
	}
	public void printToMaxOfDigits2(int n){
		if(n <= 0) {
			System.out.println("输入不合法,n至少应该大于0");
			return ;
		}
		//声明一个字符串数组,用来存放一个大数,并初始化为0
		char[] number = new char[n];
		for (int i = 0; i < number.length; i++) {
			number[i] = '0';
		}

		for (int i = 0; i < 10; ++i) {
			number[0] = (char) (i + '0');//首位历经1-9
			printToMaxOfNDigitsRecursively(number, n, 0);
		}		
	}
	//利用递归实现1到最大的n位数的全排列
	public void printToMaxOfNDigitsRecursively(char[] number, int n, int index) {
		if(index == n - 1){//如果到最后一位则打印这个数
			printNumber(number);
			return;
		}
		for (int i = 0; i < 10; ++i) {
			number[index + 1] = (char) (i + '0');
			printToMaxOfNDigitsRecursively(number, n, index + 1);
		}
	}	
	
	//避免出现 0000这种情况
	public void printNumber(char[] number) {
		boolean isBeginning0 = true;
		int length = number.length;
		for (int i = 0; i < number.length; i++) {
			if (isBeginning0 && number[i] != '0' ) {
				isBeginning0 = false;
			}
			if (!isBeginning0) {
				System.out.print(number[i]);
			}
		}
		System.out.println();		
	}	
	
	
	public static void main(String[] args) {
		Scanner input = new  Scanner(System.in);
		int  n = input.nextInt();
		PrintToMaxOfDigits ptmd = new PrintToMaxOfDigits();
//		ptmd.printToMaxOfDigits1(n);
		ptmd.printToMaxOfDigits2(n);

	}

}

猜你喜欢

转载自blog.csdn.net/hxl0925/article/details/89430337