1. 程式人生 > >列印從1到n的最大n位數——面試題12《劍指offer 》

列印從1到n的最大n位數——面試題12《劍指offer 》

題目:

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

C++程式碼實現:

void printNumber(int n) {
	if (n < 0) return;

    //陣列的初始化
	char *number = new char[n + 1];    //建立一個n+1,多出來一個儲存'\0'
	memset(number, '0', n);            //每一位都設定為0
	number[n] = '\0';

    //遞增以及列印
	while (!Increment(number)) {
		printNumber(number);
	}
	delete[]number;    //釋放記憶體空間
}


//陣列高位為數值的個位
//用於數值向上加,且number只儲存當前一個數
bool Increment(char *number)
{
    //設定初始狀態
    bool isOverFlow = false;    //最高位進位情況
    int carry = 0;              //每次計算的進位情況
    int len =strlen(number);    //字元長度
    for(int i = len-1;i>=0;i--)
    {
        int temp_num = number[i] - '0' + carry;    //字元轉換為數值
        if(i==len-1)        //個位加
            temp_num++;        
        if(temp_num >= 10)
        {
            if(i == 0)    //最高為產生進位
                isOverFlow = True;
            else          //不是最高位則處理資料
            {
                carry = 1;
                temp_num -= 10;
                number = temp_num + '0'; 
            }
        }    
        else             //沒有進位,則當前位加完之後退出即可
        {
            number =temp_num +'0';
            break;
        }
    }
    return isOverFlow;
}


//列印字串,一個數
void PrintNumber(char *number)
{
    bool isBeginning0 = true;    //是否以零作為開頭,預設為是
    int len = strlen(number)
    for(int i = 0; i<len-1; i++)
    {
        if(isBeginning0 && number[i] != '0')    //當不等於0時候
            isBeginning0 = false;    //置為0,為了輸出
        if(!isBeginning0)
            cout << number[i];
    }
    cout <<"\t";    
}

完整測試程式碼

#include<iostream>
 
using namespace std;

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");

}
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;
}


int main()
{
	int n;
	cin >> n;
	printNumber(n);

	system("pause");
	return 0;
}