剑指offer刷题———打印1到最大的n位数

问题重述:

题目:输入数字n,按顺序打印出从1到最大的n位十进制数,比如输入3,则打印出1,2,3一直到最大的三位数即999.

思路解析:

对于本问题能实现的方法很多,比如可以用循环实现,但是如何保存数据是一个很大的问题。由于题目并没有限定数据的位数,因此我们使用一般的数据类型(int ,long,long long),很容易造成溢出。因此,不妨将开辟一个限定长度的char数组,用以保存数据。

那么得到全部的数字呢,我们可以在数组上来进行加法的模拟,每次加1,直到加到最大的n位数,但是这种方法比较繁杂,需要的代码量大。还有一种方法,就是全排列。例如n为2,则有如下操作。

代码实现:

void fullPermutationAfterIndex(char* number, int length, int index);

//给定位数n
void printOneToMaxOfNDigits(int n)
{
	assert(n > 0);
	char* number = new char[n + 1];
	number[n] = '\0';
	for (int i = 0; i < 10;++i)
	{
		number[0] = i + '0';
		fullPermutationAfterIndex(number, n, 0);
	}
	delete[] number;
}
//全排列的实现
void fullPermutationAfterIndex(char *number,int length,int index)
{
	if (index == length - 1)
	{
		
		for (int i = 0; i < length; ++i)
		{
			cout << number[i];
		}
		cout << endl;
		return;

	}
	for (int i = 0; i < 10; ++i)
	{
		number[index + 1] = i + '0';
		fullPermutationAfterIndex(number, length, index + 1);
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值