幂次方

在这里插入图片描述在这里插入图片描述
emmmmmmmmmmmmmm,这已经是我第二次写这道题了,虽然看见了之后还是一脸蒙蔽……完全没有思路啊,wtf??
然后,我就看了我之前的的代码,嗯。。
首先让我们来捋一捋思路,这道题应该是一道dfs,为什么呢,深度搜索,确定了指数之后,你要继续分解,所以说是dfs最恰当不过的了,如何dfs呢??
有两种情况
1.你分解的这个数恰好是2的幂次方;
2.这个数不是2的幂次方,最后结果会是若干个多项式相加的结果。
还有一个问题,括号,你要怎么处理??
将括号分开,前半部分和后半部分,中间继续递归。

#include<iostream>
using namespace std;
int n,p[20]={};
void work(int k)
{
	if(k==1)	{printf("2(0)");return ;}
	if(k==2)	{printf("2");return ;}//处理最终值,因为最后只能是2或2(0)或2(2)的形式 
	int t;
	bool flag=true;
	for(int i=1;;i++)
	{
		if(p[i]>k)				{t=i-1;break;}//如果是有多个累加的,那么此时flag还是true 
		else if(p[i]==k)		{t=i;flag=false;break;}//如果正好是2的次方,那么此时flag也就是false 
	}
	if(flag==false)			{printf("2(");work(t);printf(")");}
	else
	{
		printf("2");
		if(t!=1)//t=1时就是可以直接输出2 
		{
			printf("(");
			work(t);
			printf(")");//最后前面的全部递归出来之后,才执行这一步 
		}
		printf("+");
		work(k-p[t]);//在处理剩下的部分 
	}
		
}
int main()  
{
	scanf("%d",&n);
	p[0]=1;
	for(int i=1;i<=15;i++)
		p[i]=p[i-1]*2;//利用数组搜索2次幂,因为数据一共就20000,所以可以有一个预处理 
	work(n);
	return 0; 
 } 

注意捋清关系,什么时候要输出什么,多模拟几遍;距离noip还有359天,相信自己

猜你喜欢

转载自blog.csdn.net/qq_43093454/article/details/84070644