程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 打印1到最大的n位數

打印1到最大的n位數

編輯:C++入門知識

解法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[n] = '\0'; 
 
    while(!Increment(str)){ 
        PrintStr(str); 
    } 
 
    delete[] str; 
}<SPAN style="FONT-SIZE: 18px"> 
</SPAN> 

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[n] = '\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; 
} 

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[] = {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; 
}


 組合實現的另一種方案:

 

nt 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)   
        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;   
}  

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) 
        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; 
}

 

i

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved