日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

2的次幂表示(递归求解)

發布時間:2024/3/13 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 2的次幂表示(递归求解) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

問題描述
  任何一個正整數都可以用2進制表示,例如:137的2進制表示為10001001。
  將這種2進制表示寫成2的次冪的和的形式,令次冪高的排在前面,可得到如下表達式:137=27+23+2^0
  現在約定冪次用括號來表示,即a^b表示為a(b)
  此時,137可表示為:2(7)+2(3)+2(0)
  進一步:7=22+2+20 (2^1用2表示)
  3=2+2^0
  所以最后137可表示為:2(2(2)+2+2(0))+2(2+2(0))+2(0)
  又如:1315=210+28+2^5+2+1
  所以1315最后可表示為:
  2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)
輸入格式
  正整數(1<=n<=20000)
輸出格式
  符合約定的n的0,2表示(在表示中不能有空格)
樣例輸入
???????137
樣例輸出
???????2(2(2)+2+2(0))+2(2+2(0))+2(0)
樣例輸入
???????1315
樣例輸出
???????2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)
提示:采用非遞歸程序較難解決,可以采用邊遞歸變輸出

???????這里的提示也已經很明顯了,說到是邊遞歸邊輸出,對于我這遞歸學的很渣的人,確實得寫寫博客反思、補補了。
???????在這里我們先將它轉化為二進制,這是毫無疑問的,在邊轉化為二進制時,邊統計1在二進制中所出現的位置,用一個數組將它存起來如a[],但如何實現遞歸呢,這里如137 = 2^ 7 + 2^ 3 + 2^ 0,此時的一個數組記錄下了7、3、0,但是對應的7、3不滿足條件,怎么辦,這里就可以采用遞歸了,7 = 2^ 2 + 2^ 1 + 2^ 0,這時就滿足條件了,記錄下對應的2、1、0,同理3 = 2^ 1 + 2^ 0也滿足條件了,記錄下對應的1、0。
???????這里又有一個很重要的點,就是終止條件,我們想一想,他只是換了一種表達形式,我們所記錄下的為它的指數,所以:

???????1.如果a[i] == 1,輸出為2
???????2.如果a[i] == 2,輸出為2(2)
???????3.如果a[i] == 0,輸出為2(0)

???????我想講到這里應該很清楚了
代碼如下:

#include<iostream> using namespace std; void fun(int x); int main() {int n;cin>>n;fun(n);return 0; }//對變量x和數組b進行操作 void fun(int x) {int a[32], i = 0, cnt = 0;//在這里的a是不能設置為全局變量,只能在每一層使用//如果使用全局變量,那么在每一層都會改變a里的值,那么a原來的數據就會丟失 while(x != 0){int m = x%2;if(m == 1){a[cnt] = i; cnt++; }x /= 2; i++;}for(i = cnt-1; i >= 0; i--){if(a[i] == 0)printf("2(0)");else if(a[i] == 1)printf("2");else if(a[i] == 2)printf("2(2)");else{printf("2("); fun(a[i]); printf(")");}if(i != 0)printf("+"); } }

強調,這里的數組a[]必須是局部變量,被重新定義,不然就會修改原來的值,在這里,被卡了好久,為什么不對呢…

總結

以上是生活随笔為你收集整理的2的次幂表示(递归求解)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。