面試題12:打印1到最大的n位數

題目:輸入數字n,按順序打印從1到最大的n位十進制數。

這是一個大數問題,n較大時會產生溢出,需要用字符串來表示數字。

方法1:將n位的字符串中每一個數字初始化爲‘0’,然後每次爲字符串表示的數字加一,再打印。需要兩步,一在字符串表達的數字上模擬加法,二將字符串表達的數字打印出來。

什麼時候停止+1?當+1時最高位產生進位,表示此時已經是最大n位數。

java實現:

public void print1ToMaxOfNDigits(int n) {
		if(n<0)
			return;
		char[] number=new char[n];
		//初始化
		for(int i=0;i<n;i++) {
			number[i]='0';
		}
		while(!increment(number)) {
			printNumber(number);
		}
	}
	
	//判斷加一後最高位是否有進位
	public boolean increment(char[] num) {
		boolean isOverflow=false;
		int nTakeOver=0; //進位
		int length=num.length;
		//從最低位開始加一,並判斷是否有進位,最高位有進位表示溢出
		for(int i=length-1;i>=0;i--) {
			int nSum=num[i]-'0'+nTakeOver;  //nSum當前位數加上進位的和
			if(i==length-1)  //初始最低位加一
				nSum++;
			//產生進位
			if(nSum>=10) {
				if(i==0)//進位是最高位
					isOverflow=true;
				else {
					nSum-=10;
					nTakeOver=1;
					num[i]=(char) (nSum+'0');
				}
			}else {
				num[i]=(char) (nSum+'0');
				break; //不產生進位,,沒有溢出,跳出循環
			}
		}
		return isOverflow;
	}
	
	//打印用字符串表示的數字,把補位的0去掉,遇到第一個非0字符再打印
	public void printNumber(char[] num) {
		int i=0;
		int size=num.length;
		while(i<size&&num[i]=='0') { //找到第一個非0字符
			i++;
		}
		if(i==size) return;  //全0不打印
		char[] printNum=Arrays.copyOfRange(num, i, size);
		System.out.println(printNum);
	}
	

方法2:n位所有十進制數就是n個從0到9的全排列,即數字的每一位都從0到9排列一遍。用遞歸求解,從第0位開始設置,直到設置了數字的最後一位。

public void print1ToMaxOfDigits2(int n) {
		char[] number=new char[n];
		Arrays.fill(number,'0');
		printOrder(number,n,0);//index從0開始一直到最後一位都被賦值。結束遞歸
	}
	public void printOrder(char[]num,int length,int index) {
		if(index==length) {
			return;
		}
		for(int i=0;i<=9;i++) {
			num[index]=(char) ('0'+i);
			if(index==length-1) {
				printNumber(num);
			}
			printOrder(num,length,index+1);
		}
	}


發佈了34 篇原創文章 · 獲贊 4 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章