蓝桥杯-算法训练 2的次幂表示
生活随笔
收集整理的這篇文章主要介紹了
蓝桥杯-算法训练 2的次幂表示
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目鏈接:http://lx.lanqiao.cn/problem.page?gpid=T235
將這種2進制表示寫成2的次冪的和的形式,令次冪高的排在前面,可得到如下表達式:137=2^7+2^3+2^0
現在約定冪次用括號來表示,即a^b表示為a(b)
此時,137可表示為:2(7)+2(3)+2(0)
進一步:7=2^2+2+2^0 (2^1用2表示)
3=2+2^0?
所以最后137可表示為:2(2(2)+2+2(0))+2(2+2(0))+2(0)
又如:1315=2^10+2^8+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的權值,然后按權值記錄編號,進行遞歸輸出。
#include<iostream> #include<cstdio> #include<ctype.h>using namespace std;void mi(int n){int ans=0;int x;int a[32];//存儲32位整數 int i=0;while(n){x=n%2;if(x==1){a[ans++]=i;}++i;n/=2;}for(i=ans-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 if(a[i]>=3){printf("2(");mi(a[i]);printf(")");}if(i!=0) printf("+");} }int main(){int n;while(scanf("%d",&n)!=EOF){mi(n);printf("\n");}return 0; }
總結
以上是生活随笔為你收集整理的蓝桥杯-算法训练 2的次幂表示的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: v$sql、v$sqlarea 、v$s
- 下一篇: Java描述设计模式(11):观察者模式