首页 > 代码库 > 打印出从1到最大的n位十进制数,如输入3 打印 1到 999

打印出从1到最大的n位十进制数,如输入3 打印 1到 999

打印出从1到最大的n位十进制数,如输入3  打印 1到 999

分析:

可能很多人想到直接求出  10的 n次方  ,然后从1打印到该数。这种情况只适合输入比较小的数字  如  1   2    3   4   5  但是当输入100时,肯定无法直接表示该数。


所以,用数组是一个不错的方法   number[n]

换种思路,n位所有十进制数其实就是n个0-9的数全排列的过程,只是排在前面的0我们不打印出来。

类似于树的深度遍历,树的深度为10层,先从第一层遍历到最后一层   ,当最后一层的所有可能选完了之后,回到上一层,上一层改变加1,然后有回到下一层(如下所示)

第一层为 number[0] 有十种选择  从  数字   0   到  数字   9

第二层为number[1]  同样有十种  从 0到 9 

........

......

如   输入 3    刚开始

        0                            0                                              0

      0             -------》0               -----》回到上层       0  1            ----》     知道最后9 9 9

  0                       0 1 ..9                                               01 ..9

这样很容易想到用递归来做,代码如下:

<span style="font-size:18px;">#include<iostream>
#include<string>
using namespace std;
void print_number(char *number)
{
	while(*number=='0'&&*number!='\0') //去掉前面的0,由于采用的递归,将低位看成高位是一样的效果,解是对称的
		++number;
	while(*number!='\0'){
		cout<<*number;
		++number;
	}

	cout<<endl;

}

void buildnumber(char *number,int length,int index)
{
	if(index==length-1)  //注意这里是等于号  不是赋值
	{
		print_number(number);
		return;
	}

	int i;
	for(i=0;i<10;i++)
	{
		number[index+1]=i+'0';   //由于前面以为已经赋值,所以从index+1开始,从0开始,
		buildnumber(number,length,index+1);  //递归调用  当前位赋值,求下一位
	}

}

int main()
{
	int n;
	cout<<"Enter a number"<<endl;
	cin>>n;

	char *number=new char[n+1];
	number[n]='\0';

	int i;
	for(i=0;i<10;i++)
	{
		number[0]=i+'0';          //将第一位赋值0 开始,然后调用build  改变其他位的值  ,当其他位的可能都走完了 从1开始(一个循环)
		buildnumber(number,n,0);
	}

	delete [] number;

	return 0;
}
</span>


打印出从1到最大的n位十进制数,如输入3 打印 1到 999