阅读背景:

《剑指offer》面试题17:打印从1到最大的n位数

来源:互联网 
void PrintToMaxOfNDigits(int n)
{
	if (n <= 0)
		return; //算法的鲁棒性

	char* number = new char[n + 1]; 
        //开辟一个存放字符数组(包含n + 1个元素 number[0]~number[n])的空间,返回字符数组首元素的地址
	memset(number, '0', n); // number[0]~number[n-1]都是'0'
	number[n] = '
void PrintToMaxOfNDigits(int n)
{
	if (n <= 0)
		return; //算法的鲁棒性

	char* number = new char[n + 1]; 
        //开辟一个存放字符数组(包含n + 1个元素 number[0]~number[n])的空间,返回字符数组首元素的地址
	memset(number, '0', n); // number[0]~number[n-1]都是'0'
	number[n] = '\0';

	while (!Increment(number)) //只要没有溢出就打印
		PrintNumber(number);

	delete[] number;
}

bool Increment(char* number)
{
	//此函数用于在表示数字的字符串上 + 1,并判断有没有溢出

	//number是一个字符串
	bool isOverflow = false;      //溢出
	int nTackOver = 0;            //进位标志
	int nLength = strlen(number); //计算字符串str 的长度,直到空结束字符
	// number[nLength - 1]是这个数字的倒数第1位
	for (int i = nLength - 1; i >= 0; i--)
	{
		int nSum = number[i]  - '0' + nTackOver;
		if (i == nLength - 1)
			nSum++;              //如果是个位(最后一位)的话,+1

		if (nSum >= 10)
			if (i == 0)
				isOverflow = true; //如果nSum==10,且是最高位,则溢出
			else
			{
				nSum -= 10;
				nTackOver = 1; //进位
				number[i] = '0' + nSum;
			}
		else
		{
			number[i] = '0' + nSum;
			break;    //运行到某一数位不需要进位,退出循环
                    // 例如520+1之后个位 nSum < 10,此时不会产生进位,也不会有溢出的情况
                    //可以直接退出循环
		}
	}
	return isOverflow;
}

void PrintNumber(char* number) //此函数用于打印数字,数字前面补位的“0”不打印
{       
	bool isBeginning0 = true;
	int nLength = strlen(number); 

	for (int i = 0; i < nLength; i++)
	{
		if (isBeginning0 && number[i] != '0')//开始不为0,第i位不是0
			isBeginning0 = false;   //例如“00098”到number[2]才不是0,两个条件都为true
		                            //isBeginning0 = false
		if (!isBeginning0)          //isBeginning0 = false才能执行输出
			cout << number[i];
	}
	cout << endl;
}


'; while (!Increment(number)) //只要没有溢出就打印 PrintNumber(number); delete[] number; } void PrintToMaxOfNDigits(int n) { if (n <= 0)



你的当前访问异常,请进行认证后继续阅读剩余内容。

分享到: