1. 程式人生 > >【C++】列印1到最大的n位數

【C++】列印1到最大的n位數

輸入數字n,按順序打印出從1到最大的n位十進位制數。例如,輸入3,則打印出1,2,3,到最大的三位數999。

不能直接使用int或者long型,因為這樣肯定會溢位,考慮用字串來輸出,將一個字串先初始化為00。。000,然後實現加法。

如何判斷已經達到最大的n位了呢?可以每輸出一次就與999.。。999比較,但這樣未免太麻煩,時間複雜度為O(N)。

如果是最大的n位數,那麼這個999.。。999再加1就會造成首位進位,也就是字元陣列的第一位進位,而其他所有小於最大n位數的都不會這樣,所以用這個來判斷,時間複雜度為O(1)。

另外在輸出時還要注意不輸出無效的前置0位。

void printNumber(int n) {
	if (n < 0) return;
	char *number = new char[n+1];
	memset(number, '0', n);
	number[n] = '\0';
	while(!Increment(number)) {
		printNumber(number);
	}
	delete []number;
}

bool Increment(char* number) {
	bool isOverflow = false;
	int nTakeover = 0;
	int nLength = strlen(number);
	for (int i = nLength - 1; i >= 0; i-- ) {
		int nSum = number[i] - '0' + nTakeover;
		if ( i == nLength - 1)
			nSum++;
		if(nSum >= 10) {
			if (i == 0)
				isOverflow = true;
			else {
				nSum -= 10;
				nTakeover = 1;
				number[i] = '0' + nSum;
			}
		}
		else {
			number[i] = '0' + nSum;
			break;
		}
	}
	return isOverflow;
}

void printNumber(char* number) {
	bool isBeginning0 = true;
	int nLength = strlen(number);
	for (int i = 0; i < nLength; i++) {
		if (isBeginning0 && number[i] != '0' )
			isBeginning0 = false;
		if(!isBeginning0) {
			printf("%c", number[i]);
		}
	}
	printf("\t");

}