冪次方


題目:冪次方

任何一個正整數都可以用22的冪次方表示。例如

137=2^7+2^3+2^0137=27+23+20

同時約定方次用括號來表示,即a^bab 可表示為a(b)a(b)。

由此可知,137137可表示為:

2(7)+2(3)+2(0)2(7)+2(3)+2(0)

進一步:

7= 2^2+2+2^07=22+2+20(2^1用2表示),並且

3=2+2^03=2+20

所以最后137137可表示為:

2(2(2)+2+2(0))+2(2+2(0))+2(0)2(2(2)+2+2(0))+2(2+2(0))+2(0)

又如:

1315=2^{10} +2^8 +2^5 +2+11315=210+28+25+2+1

所以13151315最后可表示為:

2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)

輸入格式:

一個正整數n(n≤20000)n(n20000)。

輸出格式:

符合約定的nn的0,20,2表示(在表示中不能有空格)

樣例:

cin>>1315

cout<<2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)

代碼:

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<iomanip>
#include<cmath>
using namespace std;
int search(int a)
{
    int t;
    int b;
    int k=a;
    for(int i=1;i<=14;i++)
    {
        t=1;
        for(int j=1;j<=15;j++)
        {
            t*=2;
            if(t>k)
            {
                b=j-1;
                break;
            }
        }
        t=t/2;
        k-=t;
        if(b>=3)
        {
            cout<<"2(";
            search(b);
            cout<<")";
            if(k>0)
            cout<<"+";
        }
        if(b==2)
        {
            cout<<"2(2)";
            if(k>0)
            cout<<"+";
        }
        if(b==1)
        {
            cout<<2;
            if(k>0)
            cout<<"+";
        }
        if(b==0)
        cout<<"2(0)";
        if(k<=0)
        break;
    }
}
int main()
{
    int n;
    cin>>n;
    search(n);
}

 

本題是我用遞歸算法做出的第一道題,當然此題也可暴力打表,因為20000<2^15,但遞歸顯然更高大上(並不),如果理清遞歸思路,將是對思維的極大鍛煉,唯一的方式,就是多刷題了。


免責聲明!

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



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