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 }