藍橋杯_算法訓練_2的次冪表示(遞歸)


//這個遞歸挺難得,湊合看懂


任何一個正整數都可以用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;
}


 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM