首页 > 代码库 > 打印出从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
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。