10个操作数的随机四则运算

这道题目要插入括号,所以比上次稍微难点,但是用dfs插入括号,分成三段,然后针对每一段具体操作,还是分分钟搞定,废话不多说,具体看代码的注释吧。

运行效果:

 1 #include<iostream>
 2 #include<cstdlib>
 3 #include<set>
 4 #include<ctime>
 5 #include<string.h>
 6 using namespace std;
 7 #define random(x) (rand()%x)
 8 int a[100];
 9 char s[4]={'+','-','*','/'};
10 char sym[100];
11 char brackets[100];
12 void dfs(int s,int e){//使用dfs递归添加括号 
13     if(!random(4)) return;//四分之一的概率,不进行任何操作 
14     if(e-s<=1) return;//只有一个元素或没有元素,不进行任何操作 
15     int s1=random(e-s-1)+s;//随机生成插入括号的位置 
16     int e1=random(e-s1)+s1;
17     if(s1<s||e1>e||s1>=e1)return;
18     brackets[s1]='(';brackets[e1]=')';
19     dfs(s,s1-1);//插入括号的左边几个元素 
20     dfs(e1+1,e);//括号之间的几个元素 
21     dfs(s1+1,e1-1);//括号右边的几个元素 
22 }
23 int main(){
24     srand(time(NULL)); 
25     int T=30,n;
26     set<int> mySet; 
27     while(T--){
28         n=random(18)+2;
29         memset(brackets,'.',sizeof(brackets));
30         for(int i=1;i<=n;i++){
31             a[i] = random(999)+1;
32             if(mySet.count(a[i])) a[i] = random(999)+1;//使用标准库set来避免重复 
33             mySet.insert(a[i]);
34             sym[i]=s[random(4)];
35         }
36         dfs(1,n);
37         if(brackets[1]=='(')cout<<'(';
38         cout<<a[1];
39         for(int i=2;i<=n;i++){
40             cout<<sym[i];
41             if(brackets[i]=='(')cout<<'(';
42             cout<<a[i];
43             if(brackets[i]==')')cout<<')';
44         }
45         cout<<endl;
46     }
47     return 0;
48 }
原文地址:https://www.cnblogs.com/yifan2016/p/5261593.html