• 解决二柱子问题


    一.设计思路:

    1 题目避免重复:建立两个数组,rand()函数确定随机数,将这两个数加入两个数组,重复确定随机数,判断这两个数是否与两个数组的数值相同以避免重复,无重复则输出题目。

    2 可定制(数量/打印方式):数量和打印方式用宏定义确定输出几行与几列。

    3 是否有乘除法:定义一个四则运算符的数组,前两个表示加减,后两个表示乘除,用随机数范围来确定有无乘除。

    4 数值范围:rand()函数可确定数值范围。

    5 if else语句来判断加减有无负数与除法有无余数。

    二.代码实现:

    #include<iostream>
    #include<cmath>
    using namespace std;

    void main()
    {
    int m,n,min,max,g,s,l; //m为题目数量,n为打印方式,min数值范围下界,max为数值范围上界
    int a1,a2,a3,i,j,t,a[10000],b[10000];
    cout<<"请输入题目数量和打印方式:"<<endl; //打印方式即多少题一组
    cin>>m>>n;
    cout<<"请输入数值范围:"<<endl;
    cin>>min>>max;
    if(min>max)
    {
    g=min;
    min=max;
    max=g;
    }
    s=max-min+1;
    cout<<"有无乘除法?(1/0)"<<endl;
    cin>>a1;
    cout<<"加减有无负数?(1/0)"<<endl;
    cin>>a2;
    if(a1==1)
    {
    cout<<"乘除有无余数?(1/0)"<<endl;
    cin>>a3;
    }
    cout<<endl;

    for(i=1;i<=m;i++)
    {
    a[i]=min+rand()%s;
    b[i]=min+rand()%s;
    for(j=0;j<i;j++) //判断重复
    {
    while(a[j]==a[i]&&b[j]==b[i])
    {
    a[i]=min+rand()%s;
    b[i]=min+rand()%s;
    }
    }
    }
    for(i=1;i<=m;i++)
    {
    if(a1==0)
    {
    t=rand()%2;
    if(a2==0)
    {
    if(t==0) cout<<a[i]<<"+"<<b[i];
    if(t==1)
    {
    if(a[i]>b[i]) cout<<a[i]<<"-"<<b[i];
    else cout<<b[i]<<"-"<<a[i];
    }
    }
    if(a2==1)
    {
    l=rand()%3;
    if(l==0) a[i]=a[i]*-1;
    if(l==1) b[i]=b[i]*-1;
    if(l==2) a[i]=a[i]*-1,b[i]=b[i]*-1;
    if(t==0) cout<<a[i]<<"+"<<b[i];
    if(t==1) cout<<a[i]<<"-"<<b[i];
    }
    }
    if(a1=1)
    {
    t=rand()%4;
    if(a2==0)
    {
    if(t==0) cout<<a[i]<<"+"<<b[i];
    if(t==1)
    {
    if(a[i]>b[i]) cout<<a[i]<<"-"<<b[i];
    else cout<<b[i]<<"-"<<a[i];
    }
    if(t==2) cout<<a[i]<<"*"<<b[i];
    if(t==3)
    {
    while(b[i]==0) {b[i]=min+rand()%s;}
    if(a3==1)
    {
    while(a[i]%b[i]==0) {b[i]=min+rand()%s,a[i]=min+rand()%s;}
    cout<<a[i]<<"/"<<b[i];
    }
    if(a3==0)
    {
    while(a[i]%b[i]!=0) {b[i]=min+rand()%s,a[i]=min+rand()%s;}
    cout<<a[i]<<"/"<<b[i];
    }
    }
    }
    if(a2==1)
    {
    l=rand()%4;
    if(l==0) a[i]=a[i]*-1;
    if(l==1) b[i]=b[i]*-1;
    if(l==2) a[i]=a[i]*-1,b[i]=b[i]*-1;
    if(t==0) cout<<a[i]<<"+"<<b[i];
    if(t==1) cout<<a[i]<<"-"<<b[i];
    if(t==2) cout<<a[i]<<"*"<<b[i];
    if(t==3)
    {
    while(b[i]==0) {b[i]=min+rand()%s;}
    if(a3==1)
    {
    while(a[i]%b[i]==0) {b[i]=min+rand()%s,a[i]=min+rand()%s;}
    cout<<a[i]<<"/"<<b[i];
    }
    if(a3==0)
    {
    while(a[i]%b[i]!=0) {b[i]=min+rand()%s,a[i]=min+rand()%s;}
    cout<<a[i]<<"/"<<b[i];
    }
    }
    }
    }
    cout<<"="<<endl;
    if(i%n==0) cout<<endl;
    }
    }

    三.截图:

    四.总结:

    这个问题有两个难点,即避免题目重复和条件判断是否有乘法,加减有无负数,除法有无余数等。避免数的重复,可随即取两个随机数放入两个数组中,每当取随机数时可与数组中的数比较,如果重复则取随机数,直到不满足重复条件,跳出循环。设置变量分别表示有无乘除法,有无负数和有无乘除法,分别用if语句嵌套判断是否符合条件。总体来说,先取两个不重复的随机数,然后分别根据各个变量的值来决定输出题目。

    五.时间记录日志

    日期 开始时间 结束时间 中断时间 净时间 活动 备注
    3/14 8:00 9:40 10 100 设计 思考设计思路
      15:20 16:10   50 编程 实现题目不重复
    3/15 9:10 9:35   25 思考讨论 如何嵌套条件判断
      9:30 10:25 5 55 编程 实现条件判断
    3/16 17:10 18:23   73 编程 实现输出打印方式
    3/18 10:20 11:20 10 60 写实验报告 总结和反思
                 
  • 相关阅读:
    Leetcode86.分隔链表
    Leetcode39.组合总和
    Leetcode31.下一个排列
    剑指Offer35.复杂链表复制
    剑指Offer14-I.剪绳子
    剑指Offer38.字符串的排序
    Leetcode29.两数相除
    232. Implement Queue using Stacks
    程序员跳槽指南
    226. Invert Binary Tree
  • 原文地址:https://www.cnblogs.com/houtaoliang/p/4346683.html
Copyright © 2020-2023  润新知