面试题17:打印从1到最大的n位数(C++)

一、一般解法(没有考虑到大数问题)

void PrintToMaxOfNDigits(int n)
{
	int number = 1;
	while (n--)
		number *= 10;
	for (int i = 1;i < number;++i)
		std::cout << i;
	std::cout << " ";
}

二、利用字符串数组解决大数问题

#include<iostream>
class PrintToMaxOfNDigits
{
	char* number;
	int nLength;
public:
	PrintToMaxOfNDigits(int n);
	~PrintToMaxOfNDigits() { delete[] number; }
private:
	bool Increment();
	void PrintNumber();
};
void PrintToMaxOfNDigits::PrintNumber()
{
	bool isNumber = false;//作标记,标记第一次出现非0数字
	for (int i = 0;i < nLength;++i)
	{
		if (number[i] != '0' && !isNumber)
		{
			isNumber = true;
		}
		if (isNumber)
		{
			std::cout << number[i];
		}
	}
	std::cout << " ";
}
bool PrintToMaxOfNDigits::Increment()
{
	bool isOverflow = false;
	int takeOver = 0;
	for (int i = nLength - 1;i >= 0;--i)
	{
		int oSum = number[i] - '0' + takeOver;
		if (i == nLength - 1)
		{
			oSum++;
		}
		if (oSum >= 10)//如果加1之后大于等于10需要进位
		{
			if (i == 0)//如果是最高位进位,则结束
				isOverflow = true;
			else
			{
				oSum -= 10;
				takeOver = 1;
				number[i] = '0' + oSum;
			}
		}
		else//不大于等于10,则直接加上结束
		{
			number[i] = '0' + oSum;
			break;
		}
	}
	return isOverflow;
}
PrintToMaxOfNDigits::PrintToMaxOfNDigits(int n)
{
	if (n <= 0)return;
	number = new char[n + 1];
	memset(number, '0', n);
	number[n] = '\0';
	nLength = strlen(number);
	while (!Increment())
	{
		PrintNumber();
	}
}

int main(int argc,char*argv[])
{
	PrintToMaxOfNDigits B(2);
	std::cin.get();
	return 0;
}

三、运用递归进行排列组合计算输出

#include<iostream>

class PrintToMaxOfNDigits
{
	char* number;
public:
	PrintToMaxOfNDigits(int n);
	~PrintToMaxOfNDigits() { delete[] number; }
private:
	void PrintNumber();
	void PrintToMaxOfNDigitsRecursively(int n, int index);
};
void PrintToMaxOfNDigits::PrintNumber()
{//打印字符串数组
	bool isNumber = false;
	for (int i = 0;i < strlen(number);++i)
	{
		if (number[i] != '0' && !isNumber)
			isNumber = true;
		if (isNumber)
			std::cout << number[i];
	}
	std::cout << " ";
}
void PrintToMaxOfNDigits::PrintToMaxOfNDigitsRecursively(int n, int index)
{
	if (index == n - 1)
	{//如果是个位数则将该数输出
		PrintNumber();
		return;
	}
	for (int i = 0;i < 10;++i)
	{//每一位进行递归
		number[index + 1] = '0' + i;
		PrintToMaxOfNDigitsRecursively(n, index + 1);
	}
}
PrintToMaxOfNDigits::PrintToMaxOfNDigits(int n)
{
	if (n <= 0)return;
	number = new char[n + 1];
	memset(number, '0', n);
	number[n] = '\0';
	for (int i = 0;i < 10;++i)
	{//首位数字组合
		number[0] = '0' + i;
		//首位数字之后的所有位通过递归完成
		PrintToMaxOfNDigitsRecursively(n, 0);
	}
}

int main(int argc, char* arv[])
{
	PrintToMaxOfNDigits B(2);
	std::cin.get();
	return 0;
}
发布了107 篇原创文章 · 获赞 28 · 访问量 1974

猜你喜欢

转载自blog.csdn.net/qq_38994205/article/details/104327833