冪次方
阿新 • • 發佈:2018-12-26
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天,相信自己