1. 程式人生 > >【LeetCode & 劍指offer刷題】發散思維題1:17 列印從1到最大的n位數

【LeetCode & 劍指offer刷題】發散思維題1:17 列印從1到最大的n位數

【LeetCode & 劍指offer 刷題筆記】目錄(持續更新中...)

17 列印從1到最大的n位數

  題目:輸入數字n,按順序打印出從1最大的n位十進位制數。比如輸入3,則打印出1、2、3一直到最大的3位數即999.   解題思路: (1) 此題需要考慮 大數問題 ,n位數用整型(int)或者長整型(long long)容易溢位。 常用的解決辦法是用字串或者陣列來表達大數 (2) 以下我們採用字串來解決大數問題。     可以發現n位所有十進位制數其實就是n個從0到9的
全排列(不是嚴格意義上的全排列,返回一個數組中元素所有可能的排列形式) ,即把數字的每一位都從0到9排列一遍,就得到了所有的十進位制數。只是在列印的時候, 數字排在前面的0我們不打印出來 。這種全排列採用遞迴的方式很容易表達。 (3) 判斷輸出停止條件:     如果是最大的n位數,那麼這個999.。。999再加1就會造成首位進位,也就是字符陣列的第一位進位,而其他所有小於最大n位數的都不會這樣,所以用這個來判斷(用遞迴樹時,無需考慮這個問題,產生10個遞迴分支,深度n即可   #include<iostream> 
using namespace std ;     void PrintMaxNDigits ( int n );   void PrintToMaxNDigits ( char * number , int index );   void PrintNumber ( char * number
);     void main ()   {       PrintMaxNDigits ( 2 );   }      //n 位上的 0-9 的全排列問題    void PrintMaxNDigits ( int n )   {       if ( n <= 0 )           return ;       char * number = new char [ n + 1 ];       number [ n ]= '\0' ;   //末尾,用字串時,高位在前,低位在後存       PrintToMaxNDigits ( number ,0 );  //已修改,比之前更簡潔        delete [] number ;   }     // 遞迴的過程   void PrintToMaxNDigits ( char * number , int index )   {       int len = strlen ( number );   //這裡有冗餘,len是定值,不需要每次都算,可修改     if ( index == len - 1 ) // 遞迴終止條件       {           PrintNumber ( number ); // 打印出當前的數字           return ;       }       for ( int i = 0 ; i < 10 ; i ++)  //遞迴分支,當前數取0~9      {           number [ index ]= i + '0' ;           PrintToMaxNDigits ( number , index + 1 );  //遞迴深度     }   }     // 輸出   void PrintNumber ( char * number )   {       int len = strlen ( number );       bool tag = true ;       for ( int i = 0 ; i < len ; i ++)       {           if ( tag && number [ i ]!= '0' ) // 高位為 0 的不輸出               tag = false ;           if (! tag )               cout << number [ i ];       }       if (! tag )           cout << endl ;   }     拓展: 定義一個函式,實現任意兩個整數的加法。 由於沒有限定輸入兩個數的大小範圍 ,我們也要把它當做大數問題來處理。同樣採用字串來儲存加數。