(網易2018校招筆試)[程式設計題] 魔法幣

Roninwz發表於2017-10-10

題目:

小易準備去魔法王國採購魔法神器,購買魔法神器需要使用魔法幣,但是小易現在一枚魔法幣都沒有,但是小易有兩臺魔法機器可以通過投入x(x可以為0)個魔法幣產生更多的魔法幣。
魔法機器1:如果投入x個魔法幣,魔法機器會將其變為2x+1個魔法幣
魔法機器2:如果投入x個魔法幣,魔法機器會將其變為2x+2個魔法幣
小易採購魔法神器總共需要n個魔法幣,所以小易只能通過兩臺魔法機器產生恰好n個魔法幣,小易需要你幫他設計一個投入方案使他最後恰好擁有n個魔法幣。 
輸入描述:
輸入包括一行,包括一個正整數n(1 ≤ n ≤ 10^9),表示小易需要的魔法幣數量。


輸出描述:
輸出一個字串,每個字元表示該次小易選取投入的魔法機器。其中只包含字元'1'和'2'。

輸入例子1:
10

輸出例子1:
122


程式碼:

  1. #include<iostream>  
  2. #include<string>  
  3. using namespace std;  
  4.   
  5. string magic(int n,string res){  
  6.     while(n>0){  
  7.         if(n%2==0){  
  8.             res+='2';  
  9.             n=(n-2)/2;  
  10.         }  
  11.         else{  
  12.             res+='1';  
  13.             n=(n-1)/2;  
  14.         }  
  15.     }  
  16.     return res;  
  17. }  
  18.   
  19. int main(){  
  20.     int n;  
  21.     cin>>n;  
  22.     string res="";  
  23.     res=magic(n,res);  
  24.     for(int i=res.size()-1;i>=0;i--)  
  25.         cout<<res[i];  
  26.     return 0;  
  27. }  


分析:

一開始想多了,用了DFS回溯法,然後顯示超出記憶體,可能是當n取值很大時遞迴太多的原因吧
然後又去搜尋DFS非遞迴的寫法,看了半天一臉懵逼。
後來仔細看了題目,想到了偶數與奇數,寫出來後簡直無語,筆試程式設計題真的不難,千萬不要想太多了。

最後要把res反轉一下。

轉載來自:http://blog.csdn.net/gcola007/article/details/77921478

相關文章