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;
}