1. 程式人生 > >冪次方

冪次方

在這裡插入圖片描述在這裡插入圖片描述
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天,相信自己