算法習題65:輸出1到最大的N位數

.輸出 1 到最大的 N 位數
題目:輸入數字 n,按順序輸出從 1 最大的 n 位 10 進制數。

比如輸入 3,則輸出 1、2、3 一直到最大的 3 位數即 999。

--------------------------------------------------

(1)第一種:直接法

這道題看起來還是比較簡單的

void CountNum(int N){
	int max=0;
	while(N-->0)
		max = 10*max + 9;
	int i = 1;
	while(i<=max)
		cout<<i++<<endl;
}


(2)第二種:加法模擬
似乎這麼不到十行就解決了,

不過大家可以考慮幾個問題再改進改進。

如果輸入的是20位,30位或者更大呢?

這時候我們用longlong都會溢出了,所以我們這裏不能用常規的加法進行,可以用字符串來模擬加法運算

我們new char[N+1]個字節單元,最後一個放輸出結束符號'\0'

那麼我們每次對低位+1如果等於9了,那麼就往前加一,模擬加法,這就不會有溢出現象了。

借用一個str表示當前計算到的最高位,每次從這裏輸出即可

void CountNum2(int N){
	char *str = new char[N+1];
	memset(str,'0',N);
	str[N]='\0';
	str[N-1]='1';

	char *end = str + N-1;
	char *count = end;//end表示個位數在的位置

	int n = N;
	bool isOver= false;//是否結束的標誌
	str=count;//str記錄了當前最高位的位置
	while(!isOver){
		cout<<str<<endl;
		while(!isOver && *count == '9'){
			//這裏循環是往高位找到一個非9的纔可以加1
			*count = '0';
			if(str==count){
				if(n>1){
					n--;
					str--;
					count--;
				}else
					isOver= true;
			}else
				count--;
		}
		//not 9
		(*count)++;
		count = end;
	}
}


(2)第三種:遞歸實現加法累進

其實上面加法模擬中我們發現低位一直在進行一個遞歸操作,即 ”當前位=9,向高位+1,且當前位=0,再從低位開始加法“


void CountNum3(int N){
	char *str = new char[N+1];
	memset(str,'0',N);

	str[N]='\0';
	Count(str,str,str+N-1);

}

void Count(char* p, char *str, char *end){
	if(p == end){
		while(*p < '9'){
			(*p)++;
			Print(str);
		}
		return;
	}
	while(*p <= '9'){
		*(p+1) = '0'-1;
		Count(p+1,str,end);
		(*p)++;
	}

}

void Print(char *str){
	while(*str == '0')
		str++;
	cout<<str<<endl;
}

輸出結果如下:

1
1
2
3
4
5
6
7
8
9



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章