zoukankan      html  css  js  c++  java
  • 10个操作数的随机四则运算(二)

    上一个版本有一点小问题,插括号时考虑的太少了,丢掉了几种情况,所以导致括号的数量稀少,所以我稍微改进了一下,还有,我按照老师的标准把格式也稍微改了一下

    下面是我改进后的代码

    #include<iostream>
    #include<cstdlib>
    #include<set>
    #include<ctime>
    #include<string.h>
    #include<string>
    #include<sstream>
    using namespace std;
    #define random(x) (rand()%x)
    int a[100];
    char s[4]={'+','-','*','/'};
    char sym[100];
    char brackets[100];
    int num[100];
    string numToString(int num)
    {
        stringstream ss;
        string as="";
        ss<<num;
        ss>>as;
        return as;
    }
    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;
        while(s1<s||e1>e||s1>=e1||(s1==s&&e1==e))//避免无用括号 
        { 
            s1=random(e-s-1)+s;e1=random(e-s1)+s1;
        }
        if(brackets[s1]==')'||brackets[e1]=='(') 
        {
            return;
        } 
        brackets[s1]='(';
        brackets[e1]=')';
        num[s1]++;
        num[e1]++; 
        dfs(s,s1-1);//插入括号的左边几个元素 
        dfs(e1+1,e);//括号之间的几个元素 
        dfs(s1,e1);//括号右边的几个元素 
    }
    int main()
    {
        srand(time(NULL)); 
        int T=30,n;
        set<string> mySet;
        string ans;
        while(T--)
        {
            ans="";
            n=random(8)+2;
            memset(brackets,'.',sizeof(brackets));
            memset(num,0,sizeof(num));
            for(int i=1;i<=n;i++)
            {
                a[i] = random(999)+1;
                sym[i]=s[random(4)];
            }
            dfs(1,n);
            while(brackets[1]=='('&&num[1]--)
            {
                ans+='(';
            }
            ans+=numToString(a[1]);
            for(int i=2;i<=n;i++)
            {
                ans+=sym[i];
                while(brackets[i]=='('&&num[i]--)
                {
                    ans+='(';
                } 
                ans+=numToString(a[i]);
                while(brackets[i]==')'&&num[i]--)
                {
                    ans+=')'; 
                } 
            }
            if(!mySet.count(ans)){
                cout<<ans<<endl;
                mySet.insert(ans);
            }
            else
            {
                T++;
            }
            
        }
        return 0;
    }

     

  • 相关阅读:
    黑盒测试用例设计方法
    摄像头--用例设计
    单元测试框架unittest
    ES集群启动流程
    ES 系统模型
    HBase 体系结构
    HBase 数据模型
    引用中间件导致的OOM问题调查
    BeanDefinition注册逻辑解析
    spring xml 解析bean配置文件为beanDefinition过程
  • 原文地址:https://www.cnblogs.com/yifan2016/p/5267958.html
Copyright © 2011-2022 走看看