打印1到最大的n位数
2013-08-15 10:11
309 查看
解法1:按照何老师的思路,这道题用字符串解,需要模拟一个字符串加1的操作,打印的时候注意不能把前面的0打印出来。
解法2:其实就是答应0、1、2......7、8、9中n个数的全排列(且各个数可以重复),但是前面的n不要打印出来
注:上面的代码与n个组合又不同,同样用dfs实现n个数的组合
组合实现的另一种方案:
bool Increment(char *str) { bool isOverFlow = false; int nTakeOver = 0; int nLength = strlen(str); for(int i=nLength-1;i>=0;--i){//在一个循环里面,对不同的i进行处理 int nSum = str[i] - '0' + nTakeOver; if(i == nLength - 1)//这种方式编程有特点 ++nSum; if(nSum >= 10){ str[i] = nSum - 10 + '0'; nTakeOver = 1; if(i == 0) isOverFlow = true; } else{ str[i] = nSum + '0'; break; } } return isOverFlow; } void PrintStr(char* str) { bool flag = true; while(*str){ if(flag&&*str!='0') flag = false; if(!flag||!*(str+1)) cout<<*str; ++str; } cout<<endl; } void Print1ToMax(int n) { char *str = new char[n+1]; memset(str,'0',sizeof(char)*(n+1)); str = '\0'; while(!Increment(str)){ PrintStr(str); } delete[] str; }
解法2:其实就是答应0、1、2......7、8、9中n个数的全排列(且各个数可以重复),但是前面的n不要打印出来
void Print1ToMaxRecursivelySub(char *str,int n,int index) { if(index == n){ PrintStr(str); return; } for(int i=0;i<10;++i){ //典型的dfs搜索算法 str[index] = i + '0'; ++index; Print1ToMaxRecursivelySub(str,n,index); --index; } } void Print1ToMaxRecursively(int n) { char *result = new char[n+1]; memset(result,'\0',sizeof(char)*(n+1)); Print1ToMaxRecursivelySub(result,n,0); delete[] result; }
注:上面的代码与n个组合又不同,同样用dfs实现n个数的组合
int arr[] = {0,1,2,3,4,5,6,7,8,9}; int len = 10 , m = 3; void dfs(int num , vector<int>& vec , int curnum , int index) { int i ; if(curnum == num) { for( i = 0; i < vec.size() ; ++i) cout<<vec[i]; cout<<endl; return; } for( i = index; i < len; ++i) { vec.push_back(arr[i]); dfs(num , vec , curnum + 1 , i + 1); //i是索引 vec.pop_back(); } } int main(void) { vector<int>vec; dfs(m , vec , 0 , 0); system("pause"); return 0; }
组合实现的另一种方案:
int arr[] = {1,2,3,4,5,6,7,8,9,10}; int len = 10 , m = 3; void dfs(int index , int num , vector<int> &vec) { int i ; if(index == len+1) //注意,这里特别强调是len+1 return ; if(num == 0) { for( i = 0; i < vec.size() ; ++i) cout<<vec[i]<<" "; cout<<endl; return; } vec.push_back(arr[index]); // 选取第index个元素 dfs(index + 1 , num - 1 , vec); vec.pop_back(); // 不选取第index个元素 dfs(index + 1 , num , vec); } int main(void) { vector<int>vec; dfs(0 , m , vec); return 0; }
相关文章推荐
- 《剑指offer》刷题笔记(代码完整性):打印1到最大的n位数
- 打印1到最大的n位数(C语言)
- 打印从1到n位数的最大数
- 剑指offer 3.3 代码的完整性2- 打印1到最大的n位数
- 剑指Offer面试题12[打印1到最大的n位数]
- 写函数实现打印出1到最大的n位数,形参为n位数
- 题目1515:打印1到最大的N位数
- c++面试题之打印1到最大的n位数
- 剑指offer--打印1到最大n位数
- 【剑指offer】题12:打印1到最大的n位数
- 面试题12:打印1到最大的n位数
- 题目1515:打印1到最大的N位数
- 打印1到最大的n位数
- 面试题12:打印1到最大的n位数
- 【剑指offer】面试题12:打印1到最大的n位数
- 【剑指Offer面试题】 九度OJ1515:打印1到最大的N位数
- 剑指Offer系 4000 列-面试题12:打印1到最大的n位数
- 12打印1到最大的n位数python***
- Q12:打印1到最大的n位数
- 打印1到最大的n位数