您的位置:首页 > Web前端

打印1到最大的n位数

2013-08-15 10:11 309 查看
解法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<<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 递归