打印出从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 0 1 ..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
原文:http://blog.csdn.net/yujin753/article/details/42716155