1010 幂次方

1010 幂次方

其实这一步代码感觉并不难实现,就是不好想
我们一看就明白,这一定需要递归
首先我们得明白,一个数先进行用2的次幂表示,如何表示,只需要使用O(logn)的一个循环,然后我们就能求出指数和幂了
这里注意,幂与指数都会多算一次,所以需要减去
求出指数后,分两种情况 ,一个数0或2的情况,说明不需要进行递归了,直接将指数进行输出;否则,我们还得把指数进行递归,用2次幂接着表示
指数表示完了,就要将剩下的数再次递归,剩下的数,用总数x减去我们表示的幂,剩下的重复,就是递归了
记住,循环表示会多求一次,一定要注意,一定要注意,一定得把多的一个减去

---------重新---------
我记得这个题我之前在2020考场上顿时爱上了这个题
这个题真的和那个题太像了
太难了
2020那个考试,真的太遗憾了,我完全可以拿300分,或者轻轻松松拿省1,唉,错过了就是错过了
这个题有两个步骤,一个是求和,一个将2幂指数进行分解
偶数用幂,奇数也就是搞不下去了才用加来,这是一个数学规律
这个题非常明显就是用递归
类似于这样的循环输出也就是格式化输出
那么,一般只有一个需要特殊弄,然后就按照格式化

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n;
void dfs(int x)
{
    if(x)//最后会被搞成1 1再接着往下搞就是0所以用了这个条件 
    {
        int a=1,q=0;//底数,指数
        cout<<2;//这个是第一个的格式 
        while(x>=a)//循环计算底数和指数 
        {
            ++q;
            a*=2;
            //将x用2进制表示
        }
        --q;//循环,会多算一次 
        if(q==0||q==2) cout<<"("<<q<<")";//尽头 
        if(q>=3)//先对指数进行递归 接着进行分割 
        {
            cout<<"(";
            dfs(q);
            cout<<")";

        }
        x-=a/2;//剩下的进行递归 也就是奇数,无法接着进行分割 
        if(x)
        {
            cout<<"+";//接着计算 
            dfs(x);
        }
    }
}
int main()
{
    cin>>n;
    dfs(n);//进行分割的数 
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值