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;
}
时间: 2024-08-09 02:18:05

10个操作数的随机四则运算(二)的相关文章

随机四则运算1.1版

之前写的四则运算1.0版,现在继续扩充 : <四则运算>题目的功能,要求: 题目避免重复:可以定制数量和打印方式: 可以控制下列参数 (1) 是否有乘除法 (2) 是否有括号 (3) 数值范围 (4) 加减有无负数 (5) 除法有无余数 (6) 是否支持分数(真分数.假分数…) (7) 是否支持小数(精确到多少位?) (8) 打印中每行的间隔 先上图看主要界面,及功能区,如下: 1: 一如既往的用JS来写,自认为在界面上可以做到更美观,功能也可以完全做到, 那么找几个功能来演示,那么就从默认条

随机四则运算

题目:二柱子要为上二年级的儿子编写一个程序.本程序要求随机产生30道四则运算的题目. 编程思路:在这道题中一共有三个需要随机产生的变量,即第一操作数.符号(+.-.*./)和第二操作数.第一操作数和第二操作数的随机产生比较简单,并将其设置在100以内.但遇到随机符号的时候,我也将其转化成了对数字的随机,即运用if函数,通过对四个数的随机来对应指定的符号.最后用for函数将整体循环输出30次即可. 程序代码: #include<iostream.h> #include<stdlib.h&g

四则运算二之结果

设计思想: 题目避免重复 将得到的题目放入数组,并与前面的进行匹配,若相同则跳过且变量减一. 可定制 通过一个变量控制输出来确定输出格式. 控制参数 是否有乘除法 If语句当面对除法时,控制被除数不为0.若为零,则跳过且变量减一. 数值范围 随机数控制. 加减有无负数 If语句检验随机数是否小于0,若小于零则跳过且变量减一. 除法有无余数 If语句检验,其余同上. 是否支持分数 If语句随机出现分数的运算. 实现代码: //四则运算二,王昭博,3.13,2015 #include<iostrea

C#窗体-&gt;&gt;随机四则运算

用户需求: 程序能接收用户输入的整数答案,并判断对错程序结束时,统计出答对.答错的题目数量.补充说明:0——10的整数是随机生成的用户可以选择四则运算中的一种用户可以结束程序的运行,并显示统计结果.在此基础上,做增量开发.增量内容:1)处理用户的错误输入,比如输入字母或符号等,处理除法运算中分母为0的情况,处理结果为负数的情况,保证是小学水平不出现负数,比如不能出现5-8=-3这种情况:               2)用户可以设定倒计时:               3)用户可以设定随机整数的

随机salt二次加密

我们知道,如果直接对密码进行散列,那么黑客(统称那些有能力窃取用户数据并企图得到用户密码的人)可以对一个已知密码进行散列,然后通过对比散列值得到某用户的密码.换句话说,虽然黑客不能取得某特定用户的密码,但他可以知道使用特定密码的用户有哪些. 加Salt可以一定程度上解决这一问题.所谓加Salt,就是加点"佐料".其基本想法是这样的--当用户首次提供密码时(通常是注册时),由系统自动往这个密码里撒一些"佐料",然后再散列.而当用户登录时,系统为用户提供的代码撒上同样的

随机四则运算 C语言

设计思想:出三十道一百以内数的随机四则运算题目,先随机两个一百以内的数字,再通过随机数确定四则运算算符,最后通过for循环输出三十道 源代码程序: #include <stdlib.h>#include <iostream.h>#include <conio.h>#include <time.h>int main(){ int a = 0; int b = 0; int mode = 0;//0:加 1:减 2:乘 3:除 int i = 0; srand(

随机四则运算的改进

#include<stdio.h> int Menu() { int choic; printf("\n\n\n******************************************\n"); printf("1.四则运算整数习题(试卷型)\n"); printf("2.四则运算真分数习题(试卷型)\n"); printf("3.四则运算整数习题(同步练习型)\n"); printf("4.

手机病毒满10年 高风险移动app突破二百万

从第一个移动设备恶意软件出现,至今已经十年了.现在,移动设备恶意软件在地下市场需求量突破了二百万大关. 2014年之所以出现了大量数据窃取程序,是因为地下市场对移动设备窃取程序的需求增加.现在犯罪集团在地下市场上提供了能让买家重新包装数据窃取程序的方法,这也可以解释为何仅在本季度,移动设备恶意软件和高风险App程序大约发现647000个. 今年的前三个月,地下市场出现了更多更新的APP程序包装手法.趋势科技发现它们会使用Tor洋葱网络来隐藏幕后操纵 (C&C) 服务器通讯不被发现.此外,也出现了

300道随机四则运算小程序(java编写)

这是由Java编写的300道随机四则运算小程序, 运算数范围为0~100(不包括100),运算结果保留两位小数. 程序代码: import java.util.*; class Yunsuan{ public static void main(String[] args){ Random rand = new Random(); for(int i = 0; i < 300; i++){ int num1 = (int)(rand.nextDouble() * 100); int num2 =