设为首页 加入收藏

TOP

打印1到最大的n位数
2014-11-23 18:53:43 来源: 作者: 【 】 浏览:10
Tags:打印 最大 n位数

解法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

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇HDU 4565So Easy!2012长沙邀请赛A.. 下一篇[HDU 4336]Card Collection[状态..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·Python 教程 - W3Sch (2025-12-26 12:00:51)
·Python基础教程,Pyt (2025-12-26 12:00:48)
·神仙级python入门教 (2025-12-26 12:00:46)
·“我用Java 8”已成 (2025-12-26 11:19:54)
·下载 IntelliJ IDEA (2025-12-26 11:19:52)