蓝桥杯-算法训练 2的次幂表示
生活随笔
收集整理的這篇文章主要介紹了
蓝桥杯-算法训练 2的次幂表示
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
題目鏈接:http://lx.lanqiao.cn/problem.page?gpid=T235
將這種2進(jìn)制表示寫成2的次冪的和的形式,令次冪高的排在前面,可得到如下表達(dá)式:137=2^7+2^3+2^0
現(xiàn)在約定冪次用括號來表示,即a^b表示為a(b)
此時(shí),137可表示為:2(7)+2(3)+2(0)
進(jìn)一步: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) 輸入格式 正整數(shù)(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) 提示 用遞歸實(shí)現(xiàn)會比較簡單,可以一邊遞歸一邊輸出
思路:記錄二進(jìn)制表示中是1的權(quán)值,然后按權(quán)值記錄編號,進(jìn)行遞歸輸出。
#include<iostream> #include<cstdio> #include<ctype.h>using namespace std;void mi(int n){int ans=0;int x;int a[32];//存儲32位整數(shù) 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; }
總結(jié)
以上是生活随笔為你收集整理的蓝桥杯-算法训练 2的次幂表示的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: v$sql、v$sqlarea 、v$s
- 下一篇: 算法训练 未名湖边的烦恼