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

问题:输入数字n,按顺序打印出从1到最大的n位十进制数。

输入:n

输出:打印数字

思路:

易错思路:求出最大的n位十进制数,然后for循环打印。

错误原因:最大的n位十进制数有可能超出int型(或longlong型)。

利用数组(或字符串)来表达大数。

代码:

#include <iostream>
#include <string.h>
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(number[i]!='0'&&isBeginning0)
			isBeginning0 =false;
		if(!isBeginning0)
		{
			printf("%c",number[i]);
		}
	}
	printf("\t");
}
void Print1ToMaxOfNDigits(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=3;
	Print1ToMaxOfNDigits(n);
	return 0;
}

复杂度分析:

时间复杂度为O(10^n*n),空间复杂度O(n)

发布了58 篇原创文章 · 获赞 10 · 访问量 7523

猜你喜欢

转载自blog.csdn.net/qq_22148493/article/details/104463929