算術式爲零

題目:1到N的數字,在中間增加‘+’、‘-’、‘ ’,使算術式值爲零。

例如:N=7,1-23-45+67=0;

思路:

N個數之間需要加入N-1個符號,每個符號有三種可能,進行窮舉,計算算式的結果,結果爲零的話輸出,符號確定後要先去掉空格,得到實際參加運算的數字。

 

  1. char s[20]/*除去空格後的字符*/,q[3]={'+','-','.'},gg[20];//gg爲符號集  
  2. int cnt=0,n,bb[20];//bb爲實際運算的數字  
  3. void dfs(int u)  
  4. {  
  5.  if(u==n-1)  
  6.  {  
  7.      int t=1;  
  8.      bb[0]=1;  
  9.      int k=0;  
  10.      for(int i=0;i<n-1;i++)  
  11.      {  
  12.          if(gg[i]=='.')  
  13.          {  
  14.              if(t+1<10)  
  15.                  bb[k]=bb[k]*10+t+1;  
  16.              else 
  17.                  bb[k]=bb[k]*100+t+1;  
  18.              t++;  
  19.  
  20.          }  
  21.          else 
  22.          {  
  23.              s[k]=gg[i];  
  24.              k++;  
  25.              bb[k]=t+1;  
  26.              t++;  
  27.          }  
  28.      }  
  29.      int result=bb[0];;  
  30.      for(int i=0;i<k;i++)  
  31.      {  
  32.          if(s[i]=='+')  
  33.              result+=bb[i+1];  
  34.          else if(s[i]=='-')  
  35.              result-=bb[i+1];  
  36.      }  
  37.      if(result==0&&cnt<20)  
  38.      {  
  39.          cnt++;  
  40.          cout<<bb[0];  
  41.          for(int i=0;i<k;i++)  
  42.          {  
  43.              cout<<s[i]<<bb[i+1];  
  44.          }  
  45.          cout<<endl;  
  46.      }  
  47.  }  
  48.  else 
  49.  {  
  50.      for(int i=0;i<3;i++)  
  51.      {  
  52.          gg[u]=q[i];  
  53.          dfs(u+1);  
  54.      }  
  55.  }  
  56. }  
  57. int main()  
  58. {  
  59.    scanf("%d",&n);  
  60.     dfs(0);  
  61.     printf("%d\n",cnt);  
  62.     return 0;  
  63. }  

運行結果:

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
請按任意鍵繼續. . .

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章