入门OJ 3168【等式】

时间:2021-02-15 19:56:20

描述

  有一个未完成的等式:1  2  3  4  5  6  7  8  9=N。

题目

  给出整数N的具体值后,请你在2,3,4,5,6,7,8,9这8个数字的每一个前面,或插入一个运算符号“+”号,或插入一个运算符号“-”号,或不插入任何运算符号,使等式成立,并统计出能使等式成立的算式总数,若无解,则输出0。例如:取N为108时,共能写出15个不同的等式,以下就是其中的二个算式:

1+23+4+56+7+8+9=108     
123-45+6+7+8+9=108

输入

  只有1个数,即整数N的值。-30000≤n≤1000000

输出

  只有一行,该行只有1个数,表示能使等式成立的算式总数。

输入样例1

108

 

输出样例1

15

 

解题思路

  此题先DFS搜一遍从2到9每个数字前的符号情况,用数组存起来,最后在求值即可。

题解

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int n,ans=0; 
 4 bool flag; 
 5 int num[11];//0没有,1加法,2减法 
 6 void dfs(int sum)
 7 {
 8     if(sum==10)//所有的枚举完了 
 9     {
10         int q=0,p=0;//q是总值,p是变量值 
11         for(int i=1;i<=9;)//九个数字 
12         {
13             if(num[i]==1)flag=true;//true就是加,false是减 
14             if(num[i]==2)flag=false;
15             p=i;//首先存入这个数 再来看他后面的符号 
16             i++;
17             while(num[i]==0&&i<=9)//判断数字连着的情况,*10+数字即可 
18             {
19                 p=p*10+i;
20                 i++;
21             }
22             if(flag)//加法就加 
23             {
24                 q+=p;
25             }
26             else q-=p;//减法就减 
27         }
28         if(q==n)ans++;  //值是正确的方案加一 
29         return;
30     } 
31     num[sum]=0;//搜索三种符号情况 
32     dfs(sum+1);
33     num[sum]=1;
34     dfs(sum+1);
35     num[sum]=2;
36     dfs(sum+1);
37 }
38 int main()
39 {
40     cin>>n;
41     num[1]=1;//1前面一定是加,不要忘了 
42     dfs(2);//从第二位前面开始 
43     cout<<ans;
44     return 0; 
45 }

 借鉴专用区(大家都懂)

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int n,ans=0; 
 4 bool flag;
 5 int num[11];
 6 void dfs(int sum)
 7 {
 8     if(sum==10)
 9     {
10         int q=0,p=0;
11         for(int i=1;i<=9;)
12         {
13             if(num[i]==1)flag=true;
14             if(num[i]==2)flag=false;
15             p=i;
16             i++;
17             while(num[i]==0&&i<=9)
18             {
19                 p=p*10+i;
20                 i++;
21             }
22             if(flag)
23             {
24                 q+=p;
25             }
26             else q-=p;
27         }
28         if(q==n)ans++;  
29         return;
30     } 
31     num[sum]=0;
32     dfs(sum+1);
33     num[sum]=1;
34     dfs(sum+1);
35     num[sum]=2;
36     dfs(sum+1);
37 }
38 int main()
39 {
40     cin>>n;
41     num[1]=1;
42     dfs(2);
43     cout<<ans;
44     return 0; 
45 }