題目:1到N的數字,在中間增長‘+’、‘-’、‘ ’,使算術式值爲零。ide
例如:N=7,1-23-45+67=0;spa
思路:string
N個數之間須要加入N-1個符號,每一個符號有三種可能,進行窮舉,計算算式的結果,結果爲零的話輸出,符號肯定後要先去掉空格,獲得實際參加運算的數字。it
- char s[20]/*除去空格後的字符*/,q[3]={'+','-','.'},gg[20];//gg爲符號集
- int cnt=0,n,bb[20];//bb爲實際運算的數字
- void dfs(int u)
- {
- if(u==n-1)
- {
- int t=1;
- bb[0]=1;
- int k=0;
- for(int i=0;i<n-1;i++)
- {
- if(gg[i]=='.')
- {
- if(t+1<10)
- bb[k]=bb[k]*10+t+1;
- else
- bb[k]=bb[k]*100+t+1;
- t++;
- }
- else
- {
- s[k]=gg[i];
- k++;
- bb[k]=t+1;
- t++;
- }
- }
- int result=bb[0];;
- for(int i=0;i<k;i++)
- {
- if(s[i]=='+')
- result+=bb[i+1];
- else if(s[i]=='-')
- result-=bb[i+1];
- }
- if(result==0&&cnt<20)
- {
- cnt++;
- cout<<bb[0];
- for(int i=0;i<k;i++)
- {
- cout<<s[i]<<bb[i+1];
- }
- cout<<endl;
- }
- }
- else
- {
- for(int i=0;i<3;i++)
- {
- gg[u]=q[i];
- dfs(u+1);
- }
- }
- }
- int main()
- {
- scanf("%d",&n);
- dfs(0);
- printf("%d\n",cnt);
- return 0;
- }
運行結果:class
7
1+2-3+4-5-6+7
1+2-3-4+5+6-7
1-2+3+4-5+6-7
1-2-3-4-5+6+7
1-23+4+5+6+7
1-23-45+67
6
請按任意鍵繼續. . .word