P1010 幂次方

题目描述

任何一个正整数都可以用 \(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^7\) 用 \(2\) 表示),并且

\(3=2+2^0\)

所以最后$ 137 $可表示为:

\(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+1\)

所以 \(1315\) 最后可表示为:

\(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\) 的 \(0,2\) 表示(在表示中不能有空格)

输入输出样例

输入样例#1:

1315

输出样例#1:

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

分析

分治法递归求解

关于找最大幂 可以用公式 \(floor(log(n)/log(2))\) 也可以循环移位找

要注意 2 的处理 加法的位置

代码

#include<iostream>
#include<cmath>

using namespace std;

void fun(int n){
    if(n==1){
        cout<<"2(0)";
    }else if(n==2){
        cout<<"2";
    }else if(n==4){
        cout<<"2(2)";
    }else{
        int a;
        while(1){
            if(n==0){
                break;
            }else if(n==1||n==2||n==4){
                fun(n);
                break;
            }else{
                a = floor(log(n)/log(2));

                if(a==1){
                    cout<<"2";
                }else{
                    cout<<"2(";
                    fun(a);
                    cout<<")";
                }
                if(n-pow(2,a)){cout<<"+";}  
            }
               n = n-pow(2,a);                      
        }
    }
}

int main(){
    int n;
    cin>>n;
    fun(n);
    return 0;
}
上一篇:二的幂次方


下一篇:算式900