//這個遞歸挺難得,湊合看懂
任何一個正整數都可以用2進制表示,例如:137的2進制表示為10001001。將這種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表示(在表示中不能有空格)
樣例輸入
1
|
137
|
樣例輸出
1
|
2(2(2)+2+2(0))+2(2+2(0))+2(0)
|
樣例輸入
1
|
1315
|
樣例輸出
1
|
2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)
|
提示
用遞歸實現會比較簡單,可以一邊遞歸一邊輸出。
解題思路
基本算法是數轉二進制,使用求余+除法循環計算。題目提示了遞歸,但是一下遞歸不容易寫對而且不好調試,可以一步步來,先寫成某個數的次方和,調試正確后再對次方遞歸解析。
遞歸時,上一次計算的次方成為新的數,應該注意這個數為0和為2時的特殊情況。
一個數被分解后,成為剩余的數+2的次方,這兩個數其中之一都可能為0,應該注意只有這兩個數都非零時才輸出'+'號
#include<iostream> #include<stdio.h> #include<stdlib.h> #include<memory.h> #include<algorithm> #include<math.h> using namespace std; void put(int num,int n){//num為當前數,n為幾次方 //printf("num = %d, n = %d\n",num,n); if(num==0)return;//結束條件,分解結束 int r=num%2;//最后一位取出來 num=num>>1;//右移一位 put(num,n+1);//下一位次方 +1 if(num&&r)printf("+");//前面和當前位非0的時候輸出'+'號 if(r){//當前最后一位 非0 那么輸出對應的表示 if(n==1) printf("2"); else{ printf("2("); if (n==0)printf("0"); else put(n,0);//次方大於等於2 時,繼續分解 printf(")"); } } } int main(){ int num; scanf("%d",&num); put(num,0);//剛開始 最后一位 是0次方 return 0; }