输出1到最大n位数之间的所有数
2014-03-18 10:08
232 查看
[b]比如[/b]
n = 2
那么从1一直输出到99
[b]分析[/b]
直接输出,遇到大数时肯定有问题,比如n=100,存储100位的数据类型不存在。
可以利用数组来存储大数,比如n=100,可以开辟个数组 char a[101]
[b]思路一[/b]
模拟现实中的技术方式,逢九进一
参考代码
结果
[b]思路二[/b]
本质可以看作是全排列,只是前边的0别输出
结果
分析
1. 输出问题:一开始为0不要输出,这需要输出时判断下
2. 递归全排列的本质原理:每一位字符0~0都有可能,在方位本位的时候递归遍历下一位。
n = 2
那么从1一直输出到99
[b]分析[/b]
直接输出,遇到大数时肯定有问题,比如n=100,存储100位的数据类型不存在。
可以利用数组来存储大数,比如n=100,可以开辟个数组 char a[101]
[b]思路一[/b]
模拟现实中的技术方式,逢九进一
参考代码
#include <iostream> #include <cstring> using namespace std; bool minuxOne(char *a, int *end_index, int size) { if((*end_index == size - 1 && a[size - 1] == '0') || *end_index < 0 || *end_index >= size) return false; int tmp = size - 2; if(a[size - 1] != '0') --a[size -1]; else { a[size - 1] = '9'; while(1) { if(a[tmp] == '0') { a[tmp] = '9'; --tmp; } else { --a[tmp]; break; } } if(a[*end_index] == '0') ++*end_index; } return true; } bool printNum(const int size) { if(size < 0) return false; char *a = new char[size]; memset(a, '9', size); int end_index = 0; while(1) { if(end_index == size - 1 && a[size - 1] == '0') break; for(int i = 0; i < size; ++i) { if(end_index > i && a[i] == '0' ) continue; cout << a[i]; } cout << "\t"; if(!minuxOne(a, &end_index, size)) break; } delete []a; return true; } int main() { int size = 5; printNum(size); }
结果
[b]思路二[/b]
本质可以看作是全排列,只是前边的0别输出
#include <iostream> using namespace std; bool print1ToMaxN(const int n); bool print1ToMaxNRecursion(char *a, int size, int index); bool printNum(char *a, int size); int main() { int size = 3; print1ToMaxN(size); } bool print1ToMaxN(const int size) { if(size <= 0) return false; char *a = new char[size]; for(int i = 0; i <= 9; ++i) { a[0] = i + '0'; print1ToMaxNRecursion(a, size, 1); } return true; } bool print1ToMaxNRecursion(char *a, int size, int index) { if(size <= 0 || index < 0) return false; if(index == size) { printNum(a, size); return true; } for(int i = 0; i <= 9; ++i) { a[index] = i + '0'; print1ToMaxNRecursion(a, size, index + 1); } } bool printNum(char *a, int size) { if(size <= 0) return false; bool IsPre0 = true; for(int i = 0; i < size; ++i) { if(IsPre0 && a[i] != '0') IsPre0 = false; if(!IsPre0) cout << a[i]; } cout << "\t"; }
结果
分析
1. 输出问题:一开始为0不要输出,这需要输出时判断下
2. 递归全排列的本质原理:每一位字符0~0都有可能,在方位本位的时候递归遍历下一位。
相关文章推荐
- 求出0~999之间的所有“水仙花数”并输出。“水仙花数”是指一个三位数,其个位数字的立方和确好等于该数本身,如:153=1+5+3,则153是一个“水仙花数”。
- 输出0~999之间的所有“水仙花数”ps:“水仙花数”是指一个三位数,其各位数字的立方和确好等于该数本身
- java第三周--(输出任意数之间的所有完数;3位数的任意整数,输出其降序数)
- 有一个5行6列的整型二维数组,每一个位置存放一个10-100之间的整数。输出这个 二维数组所有的值,并输出最大值。
- 求100---999之间的所有水仙花数,并输出。提示:水仙花数是一个3位数的自然数,该数各位数的立方和等于该数本身
- 求出0~999之间的所有“水仙花数”并输出。“水仙花数”是指一个三位数,其各位数字的立方和确好等于该数本身,如;153=1+5+3?,则153是一个“水仙花数”。
- 求出0~999之间的所有“水仙花数”并输出。“水仙花数”是指一个三位数,其各位数字的立方和确好等于该数本身
- 求出0~999之间的所有“水仙花数”并输出。“水仙花数”是指一个三位数,其各位数字的立方和确好等于该数本身,如;153=1+5+3?,则153是一个“水仙花数”。
- 题目:判断101-200之间有多少个素数,并输出所有素数。
- 计算并输出1到n之间的所有数的平方和立方。
- 6.4计算并输出1到n之间的所有数的平方和立方
- 给出一个 m*n 的二维数组(元素可为正可为负),求该二维数组的一个子数组,且此子数组中所有元素的和最大,并输出该数组的和。
- 【程序2】 题目:判断101-200之间有多少个素数,并输出所有素数。
- 题目:判断101-200之间有多少个素数,并输出所有素数。
- 数据结构练习(28)输出1到最大的N位数
- 求出0~999之间的所有“水仙花数”并输出
- 问题二十:101-200之间有多少个素数,并输出所有素数。
- 判断101-200之间有多少个素数,并输出所有素数及素数的个数
- C语言输出从1到最大的n位数
- 求满足条件n=a!+b!+c!的所有三位数n 并输出,要求用自定义函数实现求阶乘(正常版)