解法1:按照何老师的思路,这道题用字符串解,需要模拟一个字符串加1的操作,打印的时候注意不能把前面的0打印出来。
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<
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<
解法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;
}
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& vec , int curnum , int index)
{
int i ;
if(curnum == num)
{
for( i = 0; i < vec.size() ; ++i)
cout<vec;
dfs(m , vec , 0 , 0);
system("pause");
return 0;
}
int arr[] = {0,1,2,3,4,5,6,7,8,9};
int len = 10 , m = 3;
void dfs(int num , vector& vec , int curnum , int index)
{
int i ;
if(curnum == num)
{
for( i = 0; i < vec.size() ; ++i)
cout<vec;
dfs(m , vec , 0 , 0);
system("pause");
return 0;
}
组合实现的另一种方案:
nt arr[] = {1,2,3,4,5,6,7,8,9,10};
int len = 10 , m = 3;
void dfs(int index , int num , vector &vec)
{
int i ;
if(index == len+1)
return ;
if(num == 0)
{
for( i = 0; i < vec.size() ; ++i)
cout<vec;
dfs(0 , m , vec);
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 &vec)
{
int i ;
if(index == len+1)
return ;
if(num == 0)
{
for( i = 0; i < vec.size() ; ++i)
cout<vec;
dfs(0 , m , vec);
return 0;
}
i