您的位置:首页 > 其它

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

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

运行效果:



#include<iostream>
#include<cstdlib>
#include<set>
#include<ctime>
#include<string.h>
using namespace std;
#define random(x) (rand()%x)
int a[100];
char s[4]={'+','-','*','/'};
char sym[100];
char brackets[100];
void dfs(int s,int e){//使用dfs递归添加括号
if(!random(4)) return;//四分之一的概率,不进行任何操作
if(e-s<=1) return;//只有一个元素或没有元素,不进行任何操作
int s1=random(e-s-1)+s;//随机生成插入括号的位置
int e1=random(e-s1)+s1;
if(s1<s||e1>e||s1>=e1)return;
brackets[s1]='(';brackets[e1]=')';
dfs(s,s1-1);//插入括号的左边几个元素
dfs(e1+1,e);//括号之间的几个元素
dfs(s1+1,e1-1);//括号右边的几个元素
}
int main(){
srand(time(NULL));
int T=30,n;
set<int> mySet;
while(T--){
n=random(18)+2;
memset(brackets,'.',sizeof(brackets));
for(int i=1;i<=n;i++){
a[i] = random(999)+1;
if(mySet.count(a[i])) a[i] = random(999)+1;//使用标准库set来避免重复
mySet.insert(a[i]);
sym[i]=s[random(4)];
}
dfs(1,n);
if(brackets[1]=='(')cout<<'(';
cout<<a[1];
for(int i=2;i<=n;i++){
cout<<sym[i];
if(brackets[i]=='(')cout<<'(';
cout<<a[i];
if(brackets[i]==')')cout<<')';
}
cout<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: